Запилим немного говнокода. Вопросы интеграции Go и C опущены для краткости
//
// Go
//
// Go-функция, у которой нет "//export" и которую я хочу вызвать из C
func call() {
fmt.Printf("I want to call this Go function from C.")
}
// беру указатель на эту функцию, отдаю её в C
// чтобы C по этому указателю её вызвал.
cb_ptr := unsafe.Pointer( &call )
C.function_c( cb_ptr )
//
// C
//
typedef void (*golang_callback) ();
void function_c(void *_ptr) {
golang_callback cb = (golang_callback)_ptr; // cast
cb(); // crash!
}
Я конечно понимаю, что нормальные люди так не делают.
Но хотелось бы понять разницу в механизме вызова Go-функции из C в случае, когда бы я честно написал //export и вызвал бы её как написано во всех мануалах. В чём физическая низкоуровневая разница, из-за которой у меня всё сегфолтится?