Тип C.int

Тип C.int используется в cgo для представления 32-битного целого числа со знаком, соответствующего типу int в языке C. В Go этот тип является псевдонимом для int32 и занимает 4 байта в памяти. При передаче данных между Go и C необходимо явно преобразовывать значения в C.int и обратно, так как типы int в Go могут иметь разрядность в зависимости от архитектуры.

Синтаксис

govar i C.int = 42
goInt := int(i) // преобразование C.int в Go int
cInt := C.int(goInt) // преобразование Go int в C.int

Пример

Давайте создадим простую C-функцию, которая принимает C.int и возвращает его удвоенное значение. Затем вызовем эту функцию из Go:

gopackage main

/*
#include <stdio.h>

int doubleInt(int x) {
  return x * 2;
}
*/
import "C"
import "fmt"

func main() {
  value := 21
  cValue := C.int(value)
  result := C.doubleInt(cValue)
  fmt.Println(result)
}

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

go42

Пример

Рассмотрим пример работы с массивом целых чисел, передавая указатель на C.int из Go в C:

gopackage main

/*
#include <stdio.h>

void printInts(int *arr, int size) {
  for (int i = 0; i < size; i++) {
    printf("%d ", arr[i]);
  }
  printf("\n");
}
*/
import "C"
import "fmt"

func main() {
  goInts := []int{10, 20, 30, 40, 50}
  cInts := make([]C.int, len(goInts))

  for i, v := range goInts {
    cInts[i] = C.int(v)
  }

  C.printInts(&cInts[0], C.int(len(cInts)))
  fmt.Println("Done")
}

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

go"10 20 30 40 50 "
"Done"

Пример

Покажем, как правильно обрабатывать возвращаемое значение типа C.int и преобразовывать его в тип int для дальнейшей работы в Go:

gopackage main

/*
#include <stdlib.h>

int getRandomNumber() {
  return rand() % 100;
}
*/
import "C"
import "fmt"

func main() {
  cRandom := C.getRandomNumber()
  goRandom := int(cRandom)
  fmt.Printf("Random number: %d\n", goRandom)
}

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

go"Random number: 42"

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

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