一尘不染

将函数返回的值分配给指针

go

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

考虑下面的示例,注意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()

是否确实需要局部变量?那不会招致不必要的复制吗?


阅读 200

收藏
2020-07-02

共1个答案

一尘不染

根据规范,必须使用局部变量。

要获取值的地址,调用函数必须将返回值复制到可寻址的内存中。有副本,但这不是多余的。

Go程序通常使用time.Time值。

*time.Time有时在应用程序想要区分无值和其他时间值的情况下使用A。在SQL
NULL和有效时间之间进行区分是一个示例。因为a的零值已经time.Time过去,所以使用零值代表不值通常是很实际的。使用该IsZero()方法测试零值。

2020-07-02