如何在golang中包装zlib?

dav*_*ang 3 zlib go cgo

我尝试通过使用cgo从golang调用c zlib来修复golang最慢的zip实现

但是我收到了一个错误

错误:'deflateInit'未声明(首次使用此功能)

deflateInit在zlib.h中定义

我错过了什么吗?谢谢你的任何提示.

package main

/*
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "zlib.h"
*/
import "C"

import (
    "fmt"
)

func main() {
    fmt.Println("hmmm....")
    fmt.Println(int(C.random()))
    var strm C.struct_z_stream
    fmt.Println(strm)
    ret := C.deflateInit(&strm, 5) // trouble here
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ood 6

这是您的代码的固定版本.注意#cgo LDFLAGS: -lz链接zlib库和小C函数myDeflateInit,它处理的deflateInit是宏而不是函数.还要注意定义的变化strm.

很遗憾,C宏对Go的处理非常恼火 - 我想不出一个比小C shim函数更好的方法.

package main

/*
#cgo LDFLAGS: -lz
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "zlib.h"

int myDeflateInit(z_streamp s, int n) {
     return deflateInit(s, n);
}
*/
import "C"

import (
    "fmt"
)

func main() {
    fmt.Println("hmmm....")
    fmt.Println(int(C.random()))
    var strm C.z_stream
    fmt.Println(strm)
    ret := C.myDeflateInit(&strm, 5)
    fmt.Println(ret)
}
Run Code Online (Sandbox Code Playgroud)