РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1580 of 1593 menu

Тип 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-структуры
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить