Директива //export
Директива //export используется в пакете cgo для экспорта Go-функций,
делая их доступными для вызова из C-кода. После директивы указывается имя
экспортируемой функции. Экспортированная функция должна следовать определенным
правилам: она не может иметь параметров-указателей на C-типы, содержащие
Go-указатели, и не может возвращать такие типы. Директива действует только
на функцию, следующую непосредственно за ней.
Синтаксис
//export FunctionName
func FunctionName(params) returnType {
// тело функции
}
Пример
Рассмотрим базовый пример экспорта Go-функции для вызова из C:
package main
/*
#include <stdio.h>
extern void GoFunction(void);
void callGoFunction() {
printf("Calling Go function from C\n");
GoFunction();
}
*/
import "C"
import "fmt"
//export GoFunction
func GoFunction() {
fmt.Println("Hello from Go function!")
}
func main() {
C.callGoFunction()
}
Результат выполнения кода:
"Calling Go function from C"
"Hello from Go function!"
Пример с параметрами
Экспортированная функция может принимать параметры простых типов:
package main
/*
#include <stdio.h>
extern int Add(int a, int b);
void useAdd() {
int result = Add(10, 20);
printf("Result from Go: %d\n", result);
}
*/
import "C"
import "fmt"
//export Add
func Add(a, b C.int) C.int {
return a + b
}
func main() {
C.useAdd()
}
Результат выполнения кода:
"Result from Go: 30"
Пример с возвратом строки
Для работы со строками необходимо использовать функции преобразования:
package main
/*
#include <stdio.h>
#include <stdlib.h>
extern char* GetMessage(void);
void printMessage() {
char* msg = GetMessage();
printf("Message: %s\n", msg);
free(msg);
}
*/
import "C"
import "fmt"
//export GetMessage
func GetMessage() *C.char {
msg := "Hello from Go with CGO"
return C.CString(msg)
}
func main() {
C.printMessage()
}
Результат выполнения кода:
"Message: Hello from Go with CGO"
Смотрите также
-
директиву
import C,
которая подключает C-код в Go-программу -
функцию
C.CString,
которая преобразует Go-строку в C-строку -
функцию
C.GoString,
которая преобразует C-строку в Go-строку -
функцию
C.free,
которая освобождает память, выделенную в C