Pointers 将函数返回的值赋给指针
在Go中,如何将函数调用返回的值分配给指针 考虑这个例子,注意返回一个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() 真的需要局部变量吗?这不会导致不必要的复制吗?局部变量是必需的 要获取值的地址,调用函数必须将返回值复
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)
}