在Go的中runtime/proc.go,下面显示了一段代码:
// funcPC返回函数f的入口PC。
//假定f是一个func值。否则,行为是不确定的。
// CAREFUL:在具有插件的程序中,funcPC可以
为同一函数返回不同的值(//因为
地址空间中实际上存在同一函数的多个副本)。为了安全起见,请勿
在任何==表达式中使用//函数的结果。
// 仅将结果用作开始执行代码的地址是安全的。
//go:nosplit
func funcPC(f interface{}) uintptr {
return **(**uintptr)(add(unsafe.Pointer(&f), sys.PtrSize))
}
Run Code Online (Sandbox Code Playgroud)
我不明白的是为什么不使用*(* uintptr)而不是**(** uintptr)?
因此,我在下面编写了一个测试程序来弄清楚。
package main
import (
"fmt"
"unsafe"
)
func main(){
fmt.Println()
p := funcPC(test)
fmt.Println(p)
p1 := funcPC1(test)
fmt.Println(p1)
p2 := funcPC(test)
fmt.Println(p2)
}
func test(){
fmt.Println("hello")
}
func funcPC(f func()) uintptr {
return **(**uintptr)(unsafe.Pointer(&f))
}
func funcPC1(f func()) uintptr {
return *(*uintptr)(unsafe.Pointer(&f))
}
Run Code Online (Sandbox Code Playgroud)
p不等于p1的结果使我感到困惑。当类型相同时,为什么p的值不等于p1的值?
在“学习Python 5th”的第608页上 ,有一个示例代码:
>>> list(print(x.upper(), end=' ') for x in 'spam')
S P A M [None, None, None, None]
Run Code Online (Sandbox Code Playgroud)
那么,为什么[None,None,None,None]会在最后弹出?
在golang的文档中,我找不到任何关于 的参数的解释-ldflags。
go build -ldflags "-X main.version=${IDE_DATE}-${IDE_VERSION}-${IDE_OS}-${IDE_ARCH}-DEBUG" -o $2 cmd/backend.go
Run Code Online (Sandbox Code Playgroud)
我在哪里可以找到有关的文档-ldflags?