Тип C.float

Тип C.float в Go представляет 32-битное число с плавающей точкой (соответствует типу float в C). Он используется при работе с CGO для передачи данных между Go и C-кодом. В Go-коде значения типа C.float можно преобразовывать в float32 и обратно с помощью явного приведения типа. При передаче чисел с плавающей точкой важно учитывать точность и размерность типов данных.

Синтаксис

govar f C.float = 3.14
goFloat := float32(f)
cFloat := C.float(goFloat)

Основные операции с типом C.float включают:

Пример

Давайте создадим простую C-функцию, которая принимает число с плавающей точкой, умножает его на 2 и возвращает результат:

gopackage main

/*
float multiply_by_two(float x) {
  return x * 2.0;
}
*/
import "C"
import "fmt"

func main() {
  x := C.float(5.5)
  res := C.multiply_by_two(x)
  fmt.Printf("Result: %f\n", float32(res))
}

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

go"Result: 11.000000"

В этом примере мы преобразуем Go-значение 5.5 в C.float, передаем его в C-функцию и преобразуем результат обратно в float32 для вывода.

Пример

Давайте передадим массив чисел с плавающей точкой из Go в C для вычисления среднего значения:

gopackage main

/*
float average(float *arr, int size) {
  float sum = 0.0;
  for (int i = 0; i < size; i++) {
    sum += arr[i];
  }
  return sum / size;
}
*/
import "C"
import "fmt"
import "unsafe"

func main() {
  goArr := []float32{1.5, 2.5, 3.5, 4.5, 5.5}
  cArr := make([]C.float, len(goArr))
  for i, v := range goArr {
    cArr[i] = C.float(v)
  }
  res := C.average((*C.float)(unsafe.Pointer(&cArr[0])), C.int(len(cArr)))
  fmt.Printf("Average: %f\n", float32(res))
}

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

go"Average: 3.500000"

Здесь мы создаем слайс C.float, заполняем его данными из Go-слайса и передаем указатель на первый элемент в C-функцию. Результат преобразуется обратно в float32.

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

  • тип C.double,
    который представляет 64-битное число с плавающей точкой
  • тип C.int,
    который представляет 32-битное целое число со знаком
  • функцию C.CString,
    которая преобразует строку Go в C-строку
  • раздел pointers,
    который описывает правила работы с указателями в CGO