Как работает cgo?

Senior
381 просмотров
AFK Offer AI

cgo позволяет вызывать C-код из Go и наоборот. Используется для обёрток над C-библиотеками (SQLite, OpenSSL и т.д.).

package main

/* #include <stdlib.h> #include <string.h>

int add(int a, int b) { return a + b; } */ import "C" import "fmt"

func main() { result := C.add(3, 4) fmt.Println(result) // 7

// Работа со строками cs := C.CString("hello") // Go string → C char* defer C.free(unsafe.Pointer(cs)) // ОБЯЗАТЕЛЬНО освобождать! goStr := C.GoString(cs) // C char* → Go string }

Минусы cgo:

  • Медленные вызовы — каждый cgo call ~100нс (переключение стека)
  • Ломает кросс-компиляцию (CGO_ENABLED=0 отключает)
  • Усложняет сборку (нужен C-компилятор)
  • Горутина при cgo-вызове привязывается к OS-потоку
Правило Дейва Чейни: "cgo is not Go". Используй только когда нет pure-Go альтернативы.

Следующий вопрос

Как оптимизировать database queries?