Функция 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-строк.
Синтаксис
C.CString(s)
Пример
Давайте преобразуем строку Go в C-строку и передадим ее в C-функцию, которая выводит строку в stdout:
package 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")
}
Результат выполнения кода:
"Hello, C!"
"C string printed successfully"
Пример
В этом примере мы преобразуем строку с не-ASCII символами и передадим ее в C-функцию для обработки:
package 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")
}
Результат выполнения кода:
"Привет, мир!"
"UTF-8 string printed successfully"
Пример
Если не освободить память после использования C.CString, это приведет к утечке памяти.
В этом примере показано, как правильно освободить память с помощью defer C.free:
package 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))
}
Результат выполнения кода:
"C string: Temporary string"
Смотрите также
-
функцию
C.GoString,
которая преобразует C-строку обратно в строку Go -
функцию
C.GoStringN,
которая преобразует C-строку заданной длины в строку Go -
функцию
C.CBytes,
которая преобразует срез Go в C-массив байтов -
функцию
C.free,
которая освобождает память, выделенную через C.CString или C.malloc