Вызов C-функций

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

Синтаксис

go// #include <имя_заголовочного_файла.h>
import "C"

// Вызов функции
result := C.имя_функции(аргументы)

Пример

Вызовем стандартную C-функцию pow из математической библиотеки. Первым параметром передаем основание, вторым — показатель степени:

gopackage main

// #include <math.h>
import "C"
import "fmt"

func main() {
  base := C.double(2.0)
  exp := C.double(3.0)
  res := C.pow(base, exp)
  fmt.Println(res)
}

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

go8

Пример

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

gopackage main

// #include <string.h>
import "C"
import "fmt"

func main() {
  str := C.CString("hello")
  length := C.strlen(str)
  fmt.Println(length)
  C.free(unsafe.Pointer(str))
}

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

go5

Пример

Вызовем C-функцию, которая изменяет переданные данные. Функция sin из математической библиотеки:

gopackage main

// #include <math.h>
import "C"
import "fmt"

func main() {
  val := C.double(0.5)
  res := C.sin(val)
  fmt.Println(res)
}

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

go0.479425538604203

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

  • директиву import "C",
    которая обеспечивает связь с C-кодом
  • раздел preamble,
    для вставки C-кода и директив компилятора
  • правила работы с указателями,
    чтобы избежать ошибок при передаче данных
  • функцию C.CString,
    для преобразования Go-строк в C-строки