💬Что из себя представляет пакет cgo и для чего он предназначен?
📌Cgo позволяет создавать пакеты Go, вызывающие код на C. С его помощью мы можем вызывать функции C напрямую из кода на Go и наоборот.
📌Это полезно, когда у нас есть библиотеки на C, которые мы хотим использовать в Go-проекте, или когда нам требуется взаимодействовать с системными вызовами на более низком уровне.
📌Основные особенности cgo:
1. Позволяет встраивать код на C прямо в исходники Go.
2. Автоматически обрабатывает преобразования типов между Go и C.
3. Важно быть осторожным с управлением памятью, так как Go имеет сборщик мусора, а C — нет.
📌Рассмотрим простой пример
• Пакет
• Пакет
• Функция
• Если импорту "C" сразу предшествует комментарий, этот комментарий, называемый преамбулой, используется в качестве заголовка при компиляции частей пакета C. Преамбула может содержать любой код на C, включая объявления и определения функций и переменных. Затем они могут быть переданы из кода Go, как если бы они были определены в пакете "C". Могут использоваться все имена, объявленные в преамбуле, даже если они начинаются со строчной буквы.
👉 Подробнее
📌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". Могут использоваться все имена, объявленные в преамбуле, даже если они начинаются со строчной буквы.
👉 Подробнее