Тип C.char
Тип C.char в пакете cgo представляет собой символьный тип данных,
соответствующий типу char в языке C. Этот тип используется для передачи
отдельных символов между Go и C, а также для работы со строками через указатели
на массивы символов. Тип C.char является числовым целочисленным типом,
который может быть как знаковым, так и беззнаковым в зависимости от платформы.
В Go этот тип определяется как int8 на большинстве платформ, но для
безопасности рекомендуется использовать именно C.char, а не его явное
приведение к конкретному целочисленному типу.
Синтаксис
Тип C.char используется в объявлениях переменных, параметрах функций
и при работе с C-строками. Обычно он применяется совместно с функциями
конвертации C.CString и C.GoString для преобразования между
Go-строками и C-строками.
var ch C.char
var str *C.char
Пример
Давайте создадим переменную типа C.char и присвоим ей символ:
package main
import "fmt"
/*
#include <stdio.h>
*/
import "C"
func main() {
var ch C.char = 'A'
fmt.Printf("char: %c, value: %d\n", ch, ch)
}
Результат выполнения кода:
"char: A, value: 65"
Пример
Рассмотрим передачу массива символов типа C.char из Go в C-функцию:
package main
/*
#include <stdio.h>
void printChars(char *arr, int len) {
for (int i = 0; i < len; i++) {
printf("%c ", arr[i]);
}
printf("\n");
}
*/
import "C"
import "unsafe"
func main() {
arr := []C.char{'H', 'e', 'l', 'l', 'o'}
C.printChars((*C.char)(unsafe.Pointer(&arr[0])), C.int(len(arr)))
}
Результат выполнения кода:
"H e l l o "
Пример
Рассмотрим получение массива C.char из C-функции в Go:
package main
import "fmt"
/*
char *getMessage() {
return "Hello from C";
}
*/
import "C"
func main() {
msg := C.getMessage()
goStr := C.GoString(msg)
fmt.Println(goStr)
}
Результат выполнения кода:
"Hello from C"
Пример
Рассмотрим работу со срезами типа C.char и их преобразование в Go-строку:
package main
import "fmt"
/*
#include <stdlib.h>
#include <string.h>
*/
import "C"
import "unsafe"
func main() {
cStr := C.CString("Golang with C")
defer C.free(unsafe.Pointer(cStr))
length := C.strlen(cStr)
charSlice := (*[1 << 30]C.char)(unsafe.Pointer(cStr))[:length:length]
for i, ch := range charSlice {
fmt.Printf("char[%d]: %c\n", i, ch)
}
}
Результат выполнения кода:
"char[0]: G"
"char[1]: o"
"char[2]: l"
"char[3]: a"
"char[4]: n"
"char[5]: g"
"char[6]:"
"char[7]: w"
"char[8]: i"
"char[9]: t"
"char[10]: h"
"char[11]:"
"char[12]: C"
Смотрите также
-
тип
C.int,
соответствующий целочисленному типу int в C -
функцию
C.CString,
которая преобразует Go-строку в C-строку -
функцию
C.GoString,
которая преобразует C-строку в Go-строку -
функцию
C.free,
которая освобождает память, выделенную в C