Go runtime/proc.go
には、以下に示すコードがあります。
// 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)
でしょうか。とにかく、ポインタへのポインタを持つことの意味は何ですか。
pp
指す場合はp
、への*pp
書き込みp
およびからの*pp
読み取りからの読み取りp
。p
が範囲内にある場合は、p
直接読み取ることも、直接書き込むこともできるため、これはもちろん少しばかげています。しかし、どのような場合p
でない範囲で、あるいはどのような場合pp
のポイントへのいずれか p
または q
(それ以前の論理に応じて)、あなたが使用したいか更新どちらポインタうpp
にポイント?