无 CGO 调用 C 库:利用 os/exec 和 syscall 模拟外部接口
在不引入 CGO 的前提下,通过系统调用和子进程通信调用 C 动态库,保持纯 Go 构建的便利性。 · 难度:入门 · +10XP
无 CGO 的 C 库调用
CGO 虽然强大但会增加构建复杂度和跨平台问题。本教程探索另一种方式:使用 os/exec 调用封装了 C 库的可执行文件,或者通过 syscall 直接进行系统级调用(如 ioctl)与共享库交互。虽然性能稍逊,但完全避免了 CGO 的依赖。我们将实现一个调用 libcrypto 的简单加密操作,通过管道传递数据。
package main
import (
"bytes"
"fmt"
"os/exec"
)
func sha256ViaOpenSSL(data []byte) ([]byte, error) {
cmd := exec.Command("openssl", "dgst", "-sha256", "-binary")
cmd.Stdin = bytes.NewReader(data)
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
return out.Bytes(), err
}
func main() {
hash, _ := sha256ViaOpenSSL([]byte("hello"))
fmt.Printf("%x
", hash)
}