Тип C.int
Тип C.int используется в cgo для представления
32-битного целого числа со знаком, соответствующего
типу int в языке C. В Go этот тип является
псевдонимом для int32 и занимает 4 байта
в памяти. При передаче данных между Go и C необходимо
явно преобразовывать значения в C.int и обратно,
так как типы int в Go могут иметь разрядность
в зависимости от архитектуры.
Синтаксис
var i C.int = 42
goInt := int(i) // преобразование C.int в Go int
cInt := C.int(goInt) // преобразование Go int в C.int
Пример
Давайте создадим простую C-функцию, которая принимает
C.int и возвращает его удвоенное значение.
Затем вызовем эту функцию из Go:
package 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)
}
Результат выполнения кода:
42
Пример
Рассмотрим пример работы с массивом целых чисел,
передавая указатель на C.int из Go в C:
package 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")
}
Результат выполнения кода:
"10 20 30 40 50 "
"Done"
Пример
Покажем, как правильно обрабатывать возвращаемое
значение типа C.int и преобразовывать его
в тип int для дальнейшей работы в Go:
package 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)
}
Результат выполнения кода:
"Random number: 42"