Правильное использование пустой структуры с CGO
Работа с gssapi.h
struct gss_name_struct;
typedef struct gss_name_struct * gss_name_t;
Я пытаюсь выяснить, как правильно инициализировать переменную, содержащую это
var output_name C.gss_name_t = &C.struct_gss_name_struct{}
Но такие функции, как gss_import_name, действуют так, как если бы я передавал нулевой указатель на них. Как правильно правильно инициализировать и использовать эти пустые структуры с CGO?
1 ответ
Строгая типизация Go делает работу с typedefs трудной. Лучший способ сделать ваш Go более понятным - написать небольшую функцию-обертку на C, чтобы построить структуру именно так, как вы этого хотите. В этом случае, однако, go использует байтовый массив нулевой длины для пустой структуры C, что вы можете проверить ниже. Вы можете объявить это непосредственно в go, и преобразовать это когда необходимо.
Поскольку C не является строгим с типами, использование вывода типа часто является самым простым способом назначить тип, который ожидает Go. Есть также хитрость, использующая инструмент cgo, чтобы показать нужные вам объявления типов. С помощью go tool cgo -godefs filename.go
выведет определения cgo для ваших типов. Однако, как вы видите, типы, эквивалентные go, могут стать немного грязными.
// statement in the original .go file
//var output_name C.gss_name_t = &C.struct_gss_name_struct{}
// output from cgo -godefs
// var output_name *[0]byte = &[0]byte{}
// or more succinctly
output_name := &[0]byte{}
// output_name can be converted directly to a C.gss_name_t
fmt.Printf("%+v\n", output_name)
fmt.Printf("%+v\n", C.gss_name_t(output_name))