Функция экспорта, которая возвращает массив двойников

Как в Голанге экспортировать функцию, которая возвращает массив двойников. То, как это было возможно раньше, теперь возвращает «ошибка времени выполнения: результат cgo имеет указатель Go»:

//export Init
func Init(filename string) (C.int, unsafe.Pointer) {
    var doubles [10]float64
    doubles[3] = 1.5
    return 10, unsafe.Pointer(&doubles[0])
}

person Alex Netkachov    schedule 10.04.2017    source источник


Ответы (1)


Чтобы безопасно хранить указатель в C, данные, на которые он указывает, должны быть размещены в C.

//export Init
func Init(f string) (C.size_t, *C.double) {
    size := 10

    // allocate the *C.double array
    p := C.malloc(C.size_t(size) * C.size_t(unsafe.Sizeof(C.double(0))))

    // convert the pointer to a go slice so we can index it
    doubles := (*[1<<30 - 1]C.double)(p)[:size:size]
    doubles[3] = C.double(1.5)

    return C.size_t(size), (*C.double)(p)
}
person JimB    schedule 10.04.2017
comment
Спасибо. Работает как шарм. - person Alex Netkachov; 10.04.2017