在Go语言的`runtime/proc.go`文件中,有一段如下所示的代码:
``` // funcPC返回函数f的入口点PC。 // 它假设f是一个func值。否则行为未定义。 // 注意:在带插件的程序中,funcPC可以返回相同函数的不同值(因为实际上在地址空间中有多个相同的函数副本)。 // 为了安全起见,请勿在任何==表达式中使用此函数的结果。只能将结果用作开始执行代码的地址。 ```
我不明白的是为什么不使用*(*uintptr)而是要使用**(**uintptr)?
所以我编写了下面的测试程序来弄清楚。
``` // funcPC返回函数f的入口点PC。 // 它假设f是一个func值。否则行为未定义。 // 注意:在带插件的程序中,funcPC可以返回相同函数的不同值(因为实际上在地址空间中有多个相同的函数副本)。 // 为了安全起见,请勿在任何==表达式中使用此函数的结果。只能将结果用作开始执行代码的地址。 ```
//go:nosplit
func funcPC(f interface{}) uintptr {
return **(**uintptr)(add(unsafe.Pointer(&f), sys.PtrSize))
}
我不明白的是为什么不使用*(*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))
}
p不等于p1的结果让我感到困惑。虽然它们的类型相同,但为什么p的值不等于p1的值呢?
funcPC(p)
的值是多少。反正拥有指向指针的指针有什么意义呢? - LukStormspp
指向p
,那么写入*pp
将写入p
,并且从*pp
读取的是p
的值。当然,如果p
在作用域内,这有点傻,因为您可以直接从或向p
读取或写入。但是,如果p
不在作用域内,或者如果pp
指向p
或q
中的任一个(取决于先前的逻辑),并且您想要使用或更新pp
指向的任何指针,则该怎么办? - torek