Директива //export

Директива //export используется в пакете cgo для экспорта Go-функций, делая их доступными для вызова из C-кода. После директивы указывается имя экспортируемой функции. Экспортированная функция должна следовать определенным правилам: она не может иметь параметров-указателей на C-типы, содержащие Go-указатели, и не может возвращать такие типы. Директива действует только на функцию, следующую непосредственно за ней.

Синтаксис

go//export FunctionName
func FunctionName(params) returnType {
  // тело функции
}

Пример

Рассмотрим базовый пример экспорта Go-функции для вызова из C:

gopackage 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()
}

Результат выполнения кода:

go"Calling Go function from C"
"Hello from Go function!"

Пример с параметрами

Экспортированная функция может принимать параметры простых типов:

gopackage 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()
}

Результат выполнения кода:

go"Result from Go: 30"

Пример с возвратом строки

Для работы со строками необходимо использовать функции преобразования:

gopackage 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()
}

Результат выполнения кода:

go"Message: Hello from Go with CGO"

Смотрите также

  • директиву import C,
    которая подключает C-код в Go-программу
  • функцию C.CString,
    которая преобразует Go-строку в C-строку
  • функцию C.GoString,
    которая преобразует C-строку в Go-строку
  • функцию C.free,
    которая освобождает память, выделенную в C