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

Директива import "C"

Директива import "C" используется для взаимодействия с C-кодом в Go-программах с помощью пакета cgo. Она позволяет вызывать функции из C-библиотек, использовать C-типы данных и работать с памятью, выделенной в C. Директива должна быть оформлена как обычный импорт, но располагаться в блоке комментария перед ним.

Синтаксис

// #include <stdio.h> import "C"

Перед директивой import "C" обязательно должен идти комментарий, содержащий C-код (например, включение заголовочных файлов). Между этим комментарием и директивой не должно быть пустых строк.

Пример

Рассмотрим базовый пример вызова функции printf из стандартной библиотеки C:

package main // #include <stdio.h> import "C" func main() { C.puts(C.CString("Hello from C!")) }

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

"Hello from C!"

В этом примере мы импортируем псевдо-пакет C, который предоставляет доступ к функциям и типам из C. Функция C.puts принимает C-строку, созданную с помощью C.CString.

Работа с числами

В следующем примере показано, как передать целое число в C-функцию и получить результат обратно:

package main /* int add(int a, int b) { return a + b; } */ import "C" import "fmt" func main() { result := C.add(10, 20) fmt.Println(result) }

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

30

В данном случае мы определили функцию add прямо в C-комментарии, а затем вызвали её из Go. Результат автоматически преобразуется в тип C.int, который совместим с Go-типом int.

Работа со строками

Для преобразования Go-строк в C-строки используется функция C.CString. Важно освобождать память после использования:

package main // #include <string.h> import "C" import "fmt" func main() { goStr := "Hello, Go!" cStr := C.CString(goStr) defer C.free(unsafe.Pointer(cStr)) length := C.strlen(cStr) fmt.Printf("String length: %d\n", length) }

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

"String length: 10"

Здесь мы создаём C-строку с помощью C.CString, передаём её в функцию strlen и освобождаем память через C.free. Без освобождения памяти возникнет утечка.

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

  • директиву preamble,
    которая задаёт C-код перед импортом
  • функцию C.CString,
    которая преобразует Go-строку в C-строку
  • функцию C.free,
    которая освобождает память, выделенную в C
  • функцию export,
    которая позволяет экспортировать Go-функции в C
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить