Правильное использование пустой структуры с 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))
Другие вопросы по тегам