如何在Golang中使用zlib进行封装?

huangapple go评论110阅读模式
英文:

how can I wrap zlib in golang?

问题

我试图通过使用cgo从golang调用c zlib来修复golang最慢的zip实现,但是我遇到了一个错误。

错误:'deflateInit'在此函数中未声明(第一次使用)

deflateInit在zlib.h中定义。

我是否漏掉了什么?谢谢任何提示。

  1. package main
  2. /*
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <assert.h>
  7. #include "zlib.h"
  8. */
  9. import "C"
  10. import (
  11. "fmt"
  12. )
  13. func main() {
  14. fmt.Println("hmmm....")
  15. fmt.Println(int(C.random()))
  16. var strm C.struct_z_stream
  17. fmt.Println(strm)
  18. ret := C.deflateInit(&strm, 5) // 这里有问题
  19. }
英文:

I tried to fix the golang's slowest zip implementation by calling the c zlib from golang using cgo

but I get an error

error: 'deflateInit' undeclared (first use in this function)

deflateInit is defined in zlib.h

Am I missing something? thanks for any hints.

  1. package main
  2. /*
  3. #include &lt;stdlib.h&gt;
  4. #include &lt;stdio.h&gt;
  5. #include &lt;string.h&gt;
  6. #include &lt;assert.h&gt;
  7. #include &quot;zlib.h&quot;
  8. */
  9. import &quot;C&quot;
  10. import (
  11. &quot;fmt&quot;
  12. )
  13. func main() {
  14. fmt.Println(&quot;hmmm....&quot;)
  15. fmt.Println(int(C.random()))
  16. var strm C.struct_z_stream
  17. fmt.Println(strm)
  18. ret := C.deflateInit(&amp;strm, 5) // trouble here
  19. }

答案1

得分: 7

这是您代码的修复版本。请注意#cgo LDFLAGS: -lz用于链接zlib库以及小的C函数myDeflateInit,该函数处理了deflateInit是宏而不是函数的情况。还请注意strm定义的变化。

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

  1. package main
  2. /*
  3. #cgo LDFLAGS: -lz
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <assert.h>
  8. #include "zlib.h"
  9. int myDeflateInit(z_streamp s, int n) {
  10. return deflateInit(s, n);
  11. }
  12. */
  13. import "C"
  14. import (
  15. "fmt"
  16. )
  17. func main() {
  18. fmt.Println("hmmm....")
  19. fmt.Println(int(C.random()))
  20. var strm C.z_stream
  21. fmt.Println(strm)
  22. ret := C.myDeflateInit(&strm, 5)
  23. fmt.Println(ret)
  24. }
英文:

Here is a fixed version of your code. Note the #cgo LDFLAGS: -lz to link with the zlib library and the little C function myDeflateInit which deals with the fact that deflateInit is a macro rather than a function. Note also the change in definition of strm.

C macros are rather irritating to deal with from Go unfortunately - I couldn't think of a better way than a small C shim function.

  1. package main
  2. /*
  3. #cgo LDFLAGS: -lz
  4. #include &lt;stdlib.h&gt;
  5. #include &lt;stdio.h&gt;
  6. #include &lt;string.h&gt;
  7. #include &lt;assert.h&gt;
  8. #include &quot;zlib.h&quot;
  9. int myDeflateInit(z_streamp s, int n) {
  10. return deflateInit(s, n);
  11. }
  12. */
  13. import &quot;C&quot;
  14. import (
  15. &quot;fmt&quot;
  16. )
  17. func main() {
  18. fmt.Println(&quot;hmmm....&quot;)
  19. fmt.Println(int(C.random()))
  20. var strm C.z_stream
  21. fmt.Println(strm)
  22. ret := C.myDeflateInit(&amp;strm, 5)
  23. fmt.Println(ret)
  24. }

huangapple
  • 本文由 发表于 2013年2月4日 19:56:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/14686256.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定