💬Что из себя представляет пакет cgo и для чего он предназначен?



📌Cgo позволяет создавать пакеты Go, вызывающие код на C. С его помощью мы можем вызывать функции C напрямую из кода на Go и наоборот.



📌Это полезно, когда у нас есть библиотеки на C, которые мы хотим использовать в Go-проекте, или когда нам требуется взаимодействовать с системными вызовами на более низком уровне.



📌Основные особенности cgo:

1. Позволяет встраивать код на C прямо в исходники Go.

2. Автоматически обрабатывает преобразования типов между Go и C.

3. Важно быть осторожным с управлением памятью, так как Go имеет сборщик мусора, а C — нет.



📌Рассмотрим простой пример



package rand



/*

#include <stdlib.h>

*/

import "C"



func Random() int {

return int(C.random())

}



func Seed(i int) {

C.srandom(C.uint(i))

}




Пакет rand импортирует "C", где "C" — это «псевдопакет», специальное имя, интерпретируемое cgo как ссылка на пространство имен C.



Пакет rand содержит четыре ссылки на пакет C: вызовы C.random и C.srandom, преобразование C.uint(i) и оператор импорта. Функция Random вызывает функцию random стандартной библиотеки C и возвращает результат. В C функция random возвращает значение типа C long, которое cgo представляет как тип C.long. Его нужно преобразовать в тип Go, прежде чем он сможет быть использован кодом Go за пределами этого пакета, используя обычное преобразование типов Go.



Функция Seed делает обратное. Она принимает обычный Go int, преобразует его в тип C unsigned int и передает его функции C srandom.



Если импорту "C" сразу предшествует комментарий, этот комментарий, называемый преамбулой, используется в качестве заголовка при компиляции частей пакета C. Преамбула может содержать любой код на C, включая объявления и определения функций и переменных. Затем они могут быть переданы из кода Go, как если бы они были определены в пакете "C". Могут использоваться все имена, объявленные в преамбуле, даже если они начинаются со строчной буквы.



👉 Подробнее