2016-12-08 4 views
-1

Можно ли получить адрес ссылки функции в Go?Как получить адрес функции в go?

Что-то вроде

func myFunction() { 
} 

// ... 

unsafe.Pointer(&myFunction) 

Просто это не работает таким образом. Думаю, это невозможно, но я еще не нашел доказательств.

Edit: Фон

Фоновый моего вопроса исходит от работы с ОЦП и 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 reflect get get function function pointer] (http://stackoverflow.com/questions/36126552/golang-reflect-get-closure-function-pointer/36127142#36127142); и [Как сравнить 2 функции в Go?] (http://stackoverflow.com/questions/34901307/how-to-compare-2-functions-in-go/34901677#34901677) – icza

ответ

3

function типа в Go не адресацией и не сопоставимы, так как:

указатели на функции обозначают код функции. И код анонимной функции, созданной литералом функции, сохраняется только один раз в памяти, независимо от того, сколько раз запускается код, возвращающий значение анонимной функции.

Original answer

Если вам нужно сравнить адреса через функции, которые вы можете сделать это с reflect.Pointer. Но любой способ этой операции более бессмыслен, чем невозможно, потому что:

Если v's Kind является Func, возвращаемый указатель является основным указателем кода, но не обязательно достаточно, чтобы однозначно идентифицировать одну функцию. Единственная гарантия заключается в том, что результат равен нулю тогда и только тогда, когда v является значением nil func.

1

Вы можете получить адрес функции Go, как это:

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) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^