передача массива байтов из go в cgo

У меня есть следующий код C

uint32_t cHash32(const char *s, size_t len) { return util::Hash32(s, len); }

Я вызываю его из проекта go следующим образом

func Hash32(s []byte) uint32 {
    return uint32(C.cHash32((*C.char)(unsafe.Pointer(&s)),   C.size_t(len(s))))
}

Почему-то результат сломан.

При передаче «привет» ожидаемый результат должен быть 4063302914 в соответствии с привязками python к той же библиотеке (farmhash от google).

Я предполагаю, что предположение, что s может быть переведено в *C.char, немного наивно, не так ли!

Как передать содержимое s как *C.char?


go c cgo
person Seif Lotfy    schedule 11.07.2015    source источник
comment
Как-то результат сломался...   -  person Kerrek SB    schedule 11.07.2015
comment
Улучшенное описание   -  person Seif Lotfy    schedule 11.07.2015
comment
Попробуйте заменить unsafe.Pointer(&s) на unsafe.Pointer(&s[0]). FWIW, привязка Go для farmhash уже существует.   -  person Tim Cooper    schedule 11.07.2015
comment
Эти привязки сломаны. Я могу довести его до segfault! также он сообщает о разных вещах, чем другие привязки из других языков (python-farmhash);   -  person Seif Lotfy    schedule 11.07.2015
comment
RTM, а также это.   -  person thwd    schedule 11.07.2015
comment
код, в котором :: используется для квалификации пространства имен, не совсем похож на C.   -  person The Paramagnetic Croissant    schedule 11.07.2015


Ответы (1)


Да, вы можете создать *C.char в Go через C.CString. cgo не разрешен на игровой площадке Google, поэтому вам нужно скачать эту ссылку и запустить ее локально, чтобы использовать ее.

http://play.golang.org/p/inthA1i0C2

Преобразуйте байтовый фрагмент в строку, а затем в *char C.CString(string([]byte("bytes"))).

person Drew    schedule 23.07.2015