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-потоку