Тип C.struct_

Тип C.struct_ предоставляет доступ к структурам, объявленным в C-коде, из Go-программы при использовании cgo. В первый параметр (имя структуры) передаётся имя C-структуры, с которой необходимо работать. Это позволяет создавать экземпляры C-структур, обращаться к их полям и передавать их в C-функции.

При работе с C-структурами в Go необходимо учитывать, что имена полей сохраняются в точности как в C-объявлении, а типы полей преобразуются в соответствующие типы Go (например, int преобразуется в C.int, char* в *C.char и т.д.).

Синтаксис

govar s C.struct_Name
s.field = value
value := s.field

Пример

Давайте объявим C-структуру Person с полями name и age, создадим её экземпляр в Go и заполним поля:

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

Результат выполнения кода:

go&{0xc000010250 30}

Пример

Теперь создадим C-структуру Point с полями x и y, используя указатель на структуру:

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

Результат выполнения кода:

go"x=10, y=20"

Пример

Рассмотрим пример с вложенной C-структурой Rectangle, содержащей две точки:

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

Результат выполнения кода:

go"TopLeft: (0,10), BottomRight: (20,0)"

Смотрите также

  • раздел Preamble (прямая вставка C-кода),
    в котором описывается, как объявлять C-структуры
  • тип C.CString,
    который преобразует строку Go в C-строку для заполнения полей структуры
  • раздел Вызов C-функций,
    в котором описана передача C-структур в функции
  • раздел Указатели в cgo,
    в котором рассматриваются особенности работы с указателями на C-структуры