Ошибка выполнения zdelta-go: аргумент cgo имеет указатель Go на указатель Go - PullRequest
0 голосов
/ 03 ноября 2018

Я использую пакет zdelta-go для выполнения дельта-сжатия в проекте Go. Он использует cgo для вызова кода C в исходной библиотеке zdelta-c . Это мой код для тестирования пакета:

import (
    "github.com/snej/zdelta-go"
    "log"
)

func main() {
    v1 := []byte("This is versions one")
    v2 := []byte("This is versions two")
    delta, err := zdelta.CreateDelta(v1, v2)
    if err != nil {
        log.Fatal(err)
    }
    log.Print(len(delta))
}

Вывод ошибки:

panic: runtime error: cgo argument has Go pointer to Go pointer

goroutine 1 [running]:
github.com/snej/zdelta-go.zd_deflateInit.func1(0xc420086000, 0xffffffff, 0x146f2f0, 0x90, 0x0)
    /home/ubuntu/dev/go/src/github.com/snej/zdelta-go/zdelta_utils.go:33 +0x52
github.com/snej/zdelta-go.zd_deflateInit(0xc420086000, 0xffffffff, 0x1)
    /home/ubuntu/dev/go/src/github.com/snej/zdelta-go/zdelta_utils.go:33 +0x2c5
github.com/snej/zdelta-go.(*Compressor).WriteDelta(0xc420086000, 0xc42000c200, 0x14, 0x20, 0xc42000c220, 0x14, 0x20, 0x72ffe0, 0xc42
    /home/ubuntu/dev/go/src/github.com/snej/zdelta-go/zdelta.go:132 +0x293
github.com/snej/zdelta-go.(*Compressor).CreateDelta(0xc420086000, 0xc42000c200, 0x14, 0x20, 0xc42000c220, 0x14, 0x20, 0x20, 0xc42000
    /home/ubuntu/dev/go/src/github.com/snej/zdelta-go/zdelta.go:161 +0xa5
github.com/snej/zdelta-go.CreateDelta(0xc42000c200, 0x14, 0x20, 0xc42000c220, 0x14, 0x20, 0x0, 0x4be460, 0xc420056050, 0x0, ...)
    /home/ubuntu/dev/go/src/github.com/snej/zdelta-go/zdelta.go:227 +0xb8

Эта ошибка вызвана изменением спецификации Go1.6, что указатель Go не может быть передан функции C как указатель C.

Это кодовый блок, вызывающий ошибку:

func zd_deflateInit(strm C.zd_streamp, level C.int) C.int {
    vers := C.CString(C.ZDLIB_VERSION)
    rval := C.zd_deflateInit_(strm, level, vers, C.int(unsafe.Sizeof(*strm))) --> ERROR
    C.free(unsafe.Pointer(vers))
    return rval
}

Я новичок в Go и не знаком с C, может кто-нибудь мне помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...