在Go中,如何将函数调用返回的值分配给指针?
考虑下面的示例,注意time.Now()返回一个time.Time值(不是指针):
time.Now()
time.Time
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) }
这些都失败了:
$ go build # _/home/jreinhart/tmp/go_ptr_assign ./test.go:15: cannot use time.Now() (type time.Time) as type *time.Time in assignment ./test.go:17: cannot take the address of time.Now()
是否确实需要局部变量?那不会招致不必要的复制吗?
根据规范,必须使用局部变量。
要获取值的地址,调用函数必须将返回值复制到可寻址的内存中。有副本,但这不是多余的。
Go程序通常使用time.Time值。
*time.Time有时在应用程序想要区分无值和其他时间值的情况下使用A。在SQL NULL和有效时间之间进行区分是一个示例。因为a的零值已经time.Time过去,所以使用零值代表不值通常是很实际的。使用该IsZero()方法测试零值。
*time.Time
IsZero()