2016-12-08 85 views
-1

是否可以在Go中獲取函數引用的地址?如何獲取函數的地址?

喜歡的東西

func myFunction() { 
} 

// ... 

unsafe.Pointer(&myFunction) 

只是,是不工作的方式。我猜這是不可能的,但我還沒有找到任何證據。

編輯:背景

我的問題的背景來自於處理CGO和C函數指針。 這工作:

/* 
void go_myFunction(); 

typedef void (*myFunction_f)(); 

myFunction_f pMyFunction; 
*/ 
import "C" 

//export go_myFunction 
func go_myFunction() { 
// ... 
} 

func SetupFp() { 
    C.pMyFunction = (*[0]byte)(unsafe.Pointer(C.go_myFunction)) 
} 

我也很清楚,文件指出,將指針傳遞到去功能不起作用。但上面的代碼似乎沒有那麼遠。我只是想知道是否可以跳過出口步驟。

+1

參見[地址運算符(https://golang.org/ref/spec#Address_operators)的規範。 '操作數必須是可尋址的,即變量,指針間接或片段索引操作;或可尋址結構操作數的字段選擇器;或者可尋址數組的數組索引操作 – JimB

+4

因爲在Go中沒有這樣一個函數地址,所以你究竟在做什麼? – JimB

+1

[golang反射獲取閉包函數指針]的可能重複(http://stackoverflow.com/questions/36126552/golang-reflect-get-closure-function-pointer/36127142#36127142);和[如何比較Go中的2個函數](http://stackoverflow.com/questions/34901307/how-to-compare-2-functions-in-go/34901677#34901677) – icza

回答

3

function類型在Go是不可尋址和不具有可比性,因爲:

函數指針表示該函數的代碼。而且,函數文字創建的匿名函數的代碼只會在內存中存儲一​​次,而不管返回匿名函數值的代碼運行多少次。

Original answer

如果你需要比較的一個函數的地址,你可以用reflect.Pointer做到這一點。但是這種操作比任何方式都沒有意義,因爲:

如果v的Kind是Func,返回的指針是一個底層代碼指針,但不一定足以唯一標識一個函數。唯一的保證是,當且僅當v是一個nil func值時,結果爲零。

1

你可能會得到一個圍棋函數的地址是這樣的:

package main 

import (
    "fmt" 
    "reflect" 
) 

func HelloWorld() { 
    fmt.Println("Hello, world!") 
} 

func main() { 
    var ptr uintptr = reflect.ValueOf(HelloWorld).Pointer() 
    fmt.Printf("0x%x", ptr) 
}