Функция C.CString

Функция C.CString преобразует строку типа string в строку типа *C.char, которая совместима с C-функциями, ожидающими const char*. Эта функция выделяет память в C-куче с помощью C.malloc и копирует в нее данные. Важно помнить, что выделенную память необходимо освобождать функцией C.free во избежание утечек памяти.

Функция принимает один параметр — строку Go (string). Возвращает указатель на C-строку (*C.char). Если переданная строка Go содержит символы, выходящие за пределы ASCII, они будут преобразованы в UTF-8, что соответствует стандартному поведению C-строк.

Синтаксис

goC.CString(s)

Пример

Давайте преобразуем строку Go в C-строку и передадим ее в C-функцию, которая выводит строку в stdout:

gopackage main

/*
#include <stdio.h>
#include <stdlib.h>

void printString(const char* str) {
  printf("%s\n", str);
}
*/
import "C"
import "fmt"

func main() {
  goStr := "Hello, C!"
  cStr := C.CString(goStr)
  defer C.free(unsafe.Pointer(cStr))

  C.printString(cStr)
  fmt.Println("C string printed successfully")
}

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

go"Hello, C!"
"C string printed successfully"

Пример

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

gopackage main

/*
#include <stdio.h>
#include <stdlib.h>

void printUTF8(const char* str) {
  printf("%s\n", str);
}
*/
import "C"
import "fmt"
import "unsafe"

func main() {
  goStr := "Привет, мир!"
  cStr := C.CString(goStr)
  defer C.free(unsafe.Pointer(cStr))

  C.printUTF8(cStr)
  fmt.Println("UTF-8 string printed successfully")
}

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

go"Привет, мир!"
"UTF-8 string printed successfully"

Пример

Если не освободить память после использования C.CString, это приведет к утечке памяти. В этом примере показано, как правильно освободить память с помощью defer C.free:

gopackage main

/*
#include <stdlib.h>
*/
import "C"
import "unsafe"
import "fmt"

func main() {
  s := "Temporary string"
  cStr := C.CString(s)
  defer C.free(unsafe.Pointer(cStr))

  // Используем cStr
  fmt.Printf("C string: %s\n", C.GoString(cStr))
}

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

go"C string: Temporary string"

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

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