go - 如何将 zlib 包装在 golang 中?

标签 go zlib 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
}

最佳答案

这是您的代码的固定版本。注意 #cgo LDFLAGS: -lz 链接到 zlib 库和小的 C 函数 myDeflateInit 处理 deflateInit 是一个宏而不是函数。另请注意 strm 定义的更改。

不幸的是,从 Go 处理 C 宏相当烦人 - 我想不出比一个小的 C 填充函数更好的方法。

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)
}

关于go - 如何将 zlib 包装在 golang 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14686256/

相关文章:

google-app-engine - GAE 上的 Paypal IPN 和 Golang 集成

node.js - 使用 NodeJS 压缩的 base64 查询参数

c# - 使用生成的 Golang DLL 返回字符串或 *C.Char

delphi - Indy 的 TIdCompressorZLib.compressStream 方法的参数记录在哪里?

java - 如何在 .NET 中解压缩使用 java.util.zip.Deflater 缩小的流?

c - Golang 中有 c FILE 的数据类型吗?

c - golang cgo 检查C函数是否存在

go - 如何找出 Go 语言中的 CPU 数量?

go - 我可以创建共享测试实用程序吗?

go - govmomi缺少群集名称ClusterComputeResource?