我只需要一个指向time.Time的指针,所以下面的代码似乎无效:
./c.go:5:不能取时间地址.现在()
我只是想知道为什么?有没有办法做到这一点,除了先对变量赋值并获取变量的指针?
package main
import "time"
func main() {
    _ = &time.Now()
}
Run Code Online (Sandbox Code Playgroud)
    hob*_*bbs 30
可能不满意的答案是"你不能这样做,因为规范是这么说的." 该规范说,要使用&它必须是可寻址的东西或复合文字,并且要可寻址它必须是"变量,指针间接或切片索引操作;或者是可寻址结构操作数的字段选择器;或者是可寻址数组的数组索引操作." 函数调用和方法调用肯定不在列表中.
实事求是地讲,这可能是因为一个函数的返回值可能不具有可用地址; 它可能在一个寄存器中(在这种情况下它肯定是不可寻址的)或在堆栈上(在这种情况下它有一个地址,但如果它被放入一个逃避当前范围的指针则无效.保证可寻址性,Go必须完全相当于将它分配给一个变量.但Go是一种语言,如果它要为一个变量分配存储,那将是因为你说,而不是因为编译器神奇地决定.因此它不会使函数的结果可寻址.
或者我可能过度思考它并且他们根本不想为返回一个值的函数与返回多个函数的函数有一个特殊情况:)
icz*_*cza 17
您不能直接获取函数调用的地址(或者更准确地说是函数的返回值),如hobbs所描述的那样.
还有另一种方式,但它很难看:
p := &[]time.Time{time.Now()}[0]
fmt.Printf("%T %p\n%v", p, p, *p)
Run Code Online (Sandbox Code Playgroud)
输出(Go Playground):
*time.Time 0x10438180
2009-11-10 23:00:00 +0000 UTC
Run Code Online (Sandbox Code Playgroud)
这里发生的是一个struct与一个字面创建的,包含一个元素(的返回值time.Now()),切片被索引(0 个元件)和0的地址个元件取.
所以只需使用局部变量:
t := time.Now()
p := &t
Run Code Online (Sandbox Code Playgroud)
或辅助功能:
func ptr(t time.Time) *time.Time {
    return &t
}
p := ptr(time.Now())
Run Code Online (Sandbox Code Playgroud)
这也可以是单行匿名功能:
p := func() *time.Time { t := time.Now(); return &t }()
Run Code Online (Sandbox Code Playgroud)
或作为替代方案:
p := func(t time.Time) *time.Time { return &t }(time.Now())
Run Code Online (Sandbox Code Playgroud)
有关更多替代方案,请参阅:
幸运的是,泛型现在通过仅定义一次函数提供了一种相当干净的解决方案,该函数可用于任何类型:
package main
func ptr[T any](x T) *T {
    return &x
}
func main() {
    print(ptr("foo"))
    print(ptr(42))
}
Run Code Online (Sandbox Code Playgroud)
游乐场:https://go.dev/play/p/TgpEPKjpXX7
然而,这仅从 Golang 1.18 开始起作用。对于以前的版本,您需要为每种类型提供一个函数,正如其他答案所建议的那样。