Тип C.char

Тип C.char в пакете cgo представляет собой символьный тип данных, соответствующий типу char в языке C. Этот тип используется для передачи отдельных символов между Go и C, а также для работы со строками через указатели на массивы символов. Тип C.char является числовым целочисленным типом, который может быть как знаковым, так и беззнаковым в зависимости от платформы. В Go этот тип определяется как int8 на большинстве платформ, но для безопасности рекомендуется использовать именно C.char, а не его явное приведение к конкретному целочисленному типу.

Синтаксис

Тип C.char используется в объявлениях переменных, параметрах функций и при работе с C-строками. Обычно он применяется совместно с функциями конвертации C.CString и C.GoString для преобразования между Go-строками и C-строками.

govar ch C.char
var str *C.char

Пример

Давайте создадим переменную типа C.char и присвоим ей символ:

gopackage main

import "fmt"

/*
#include <stdio.h>
*/
import "C"

func main() {
  var ch C.char = 'A'
  fmt.Printf("char: %c, value: %d\n", ch, ch)
}

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

go"char: A, value: 65"

Пример

Рассмотрим передачу массива символов типа C.char из Go в C-функцию:

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

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

go"H e l l o "

Пример

Рассмотрим получение массива C.char из C-функции в Go:

gopackage main

import "fmt"

/*
char *getMessage() {
  return "Hello from C";
}
*/
import "C"

func main() {
  msg := C.getMessage()
  goStr := C.GoString(msg)
  fmt.Println(goStr)
}

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

go"Hello from C"

Пример

Рассмотрим работу со срезами типа C.char и их преобразование в Go-строку:

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

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

go"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