Тип C.float
Тип C.float в Go представляет 32-битное число с плавающей точкой (соответствует типу float в C). Он используется при работе с CGO для передачи данных между Go и C-кодом. В Go-коде значения типа C.float можно преобразовывать в float32 и обратно с помощью явного приведения типа. При передаче чисел с плавающей точкой важно учитывать точность и размерность типов данных.
Синтаксис
var f C.float = 3.14
goFloat := float32(f)
cFloat := C.float(goFloat)
Основные операции с типом C.float включают:
- Объявление переменной:
var x C.float - Преобразование из
float32:C.float(3.14) - Преобразование в
float32:float32(x) - Использование в C-функциях в качестве аргументов и возвращаемых значений
Пример
Давайте создадим простую C-функцию, которая принимает число с плавающей точкой, умножает его на 2 и возвращает результат:
package 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))
}
Результат выполнения кода:
"Result: 11.000000"
В этом примере мы преобразуем Go-значение 5.5 в C.float, передаем его в C-функцию и преобразуем результат обратно в float32 для вывода.
Пример
Давайте передадим массив чисел с плавающей точкой из Go в C для вычисления среднего значения:
package 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))
}
Результат выполнения кода:
"Average: 3.500000"
Здесь мы создаем слайс C.float, заполняем его данными из Go-слайса и передаем указатель на первый элемент в C-функцию. Результат преобразуется обратно в float32.