Pointers 将函数返回的值赋给指针

Pointers 将函数返回的值赋给指针,pointers,go,Pointers,Go,在Go中,如何将函数调用返回的值分配给指针 考虑这个例子,注意返回一个time.time值(不是指针): 这两者都失败了: $go-build #_u/home/jreinhart/tmp/go\u ptr\u分配 ./test.go:15:无法在分配中使用time.Now()(键入time.time)作为type*time.time ./test.go:17:无法获取时间的地址。Now() 真的需要局部变量吗?这不会导致不必要的复制吗?局部变量是必需的 要获取值的地址,调用函数必须将返回值复

在Go中,如何将函数调用返回的值分配给指针

考虑这个例子,注意返回一个
time.time
值(不是指针):

这两者都失败了:

$go-build
#_u/home/jreinhart/tmp/go\u ptr\u分配
./test.go:15:无法在分配中使用time.Now()(键入time.time)作为type*time.time
./test.go:17:无法获取时间的地址。Now()

真的需要局部变量吗?这不会导致不必要的复制吗?

局部变量是必需的

要获取值的地址,调用函数必须将返回值复制到可寻址内存中。有一份,但不是额外的

围棋程序通常使用
time.time


*time.time
有时用于应用程序想要区分无值和其他时间值的情况。区分SQL NULL和有效时间就是一个例子。因为
time.time
的零值在过去已经很长时间了,所以使用零值表示无值通常是可行的。使用
IsZero()
方法测试零值

我认为局部变量是必需的。这样内存中就为time.Now()分配了一个空间。f、 t被定义为指针,但它是nil,并且在内存中没有位置,因为它没有初始化。然后通过引用分配tmp,这告诉f.t成为tmp。因此,您没有复制任何内容。请参阅可能的副本以获取解释和备选方案:;和谢谢@icza,我确实花了时间搜索这个问题,但我显然用了不同的措词。谢谢关于
time.time
值(不是指针)惯用用法的说明。我正在使用的
go gitlab
API使用了,所以我认为这是一种可行的方法。使用
*time.time
的唯一原因是,如果您想传达时间尚未设置的事实,例如,从DB读取,其中该列可以具有
NULL
值。如上所述,这会导致客户端使用繁琐。因此,作为折衷方案,可以使用
IsZero()
方法来测试是否设置了值
go
的零时间是
0001-01-01 00:00:00+0000 UTC
-不是epoch的1970-01-01-因此时间不太可能出现在DB中。
package main

import (
    "fmt"
    "time"
)

type foo struct {
    t *time.Time
}

func main() {
    var f foo 

    f.t = time.Now()  // Fail line 15

    f.t = &time.Now() // Fail line 17

    tmp := time.Now() // Workaround
    f.t = &tmp

    fmt.Println(f.t)
}