Тип C.struct_
Тип C.struct_ предоставляет доступ к структурам, объявленным в C-коде, из Go-программы при использовании cgo. В первый параметр (имя структуры) передаётся имя C-структуры, с которой необходимо работать. Это позволяет создавать экземпляры C-структур, обращаться к их полям и передавать их в C-функции.
При работе с C-структурами в Go необходимо учитывать, что имена полей сохраняются в точности как в C-объявлении, а типы полей преобразуются в соответствующие типы Go (например, int преобразуется в C.int, char* в *C.char и т.д.).
Синтаксис
var s C.struct_Name
s.field = value
value := s.field
Пример
Давайте объявим C-структуру Person с полями name и age, создадим её экземпляр в Go и заполним поля:
package main
/*
struct Person {
char* name;
int age;
};
*/
import "C"
import "fmt"
func main() {
var p C.struct_Person
p.name = C.CString("Alice")
p.age = C.int(30)
fmt.Println(p.name, p.age)
}
Результат выполнения кода:
&{0xc000010250 30}
Пример
Теперь создадим C-структуру Point с полями x и y, используя указатель на структуру:
package main
/*
struct Point {
int x;
int y;
};
*/
import "C"
import "fmt"
func main() {
p := &C.struct_Point{x: C.int(10), y: C.int(20)}
fmt.Printf("x=%d, y=%d\n", p.x, p.y)
}
Результат выполнения кода:
"x=10, y=20"
Пример
Рассмотрим пример с вложенной C-структурой Rectangle, содержащей две точки:
package main
/*
struct Point {
int x;
int y;
};
struct Rectangle {
struct Point topLeft;
struct Point bottomRight;
};
*/
import "C"
import "fmt"
func main() {
rect := C.struct_Rectangle{
topLeft: C.struct_Point{x: C.int(0), y: C.int(10)},
bottomRight: C.struct_Point{x: C.int(20), y: C.int(0)},
}
fmt.Printf("TopLeft: (%d,%d), BottomRight: (%d,%d)\n",
rect.topLeft.x, rect.topLeft.y,
rect.bottomRight.x, rect.bottomRight.y)
}
Результат выполнения кода:
"TopLeft: (0,10), BottomRight: (20,0)"
Смотрите также
-
раздел
Preamble (прямая вставка C-кода),
в котором описывается, как объявлять C-структуры -
тип
C.CString,
который преобразует строку Go в C-строку для заполнения полей структуры -
раздел
Вызов C-функций,
в котором описана передача C-структур в функции -
раздел
Указатели в cgo,
в котором рассматриваются особенности работы с указателями на C-структуры