今天体验了一下 golang 的 cgo 部分,发现 golang 确实太强,调用 c 语言部分直接像是原生操作,go 自己倒变成了一个黏胶语言了,如果我有很多比较底层的 c 库,完全可以用 go 来进行连接。
可以把 go 的特性带给 c 程序员,把 c 的性能和基础 lib 又送给 go 程序员。
做了一个小实验
package main
/*
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
static char* cat(char* str1, char* str2) {
static char buf[256];
strcpy(buf, str1);
strcat(buf, str2);
return buf;
}
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
str1, str2 := "hello", " world"
// golang string -> c string
cstr1, cstr2 := C.CString(str1), C.CString(str2)
defer C.free(unsafe.Pointer(cstr1)) // must call
defer C.free(unsafe.Pointer(cstr2))
cstr3 := C.cat(cstr1, cstr2)
// c string -> golang string
str3 := C.GoString(cstr3)
fmt.Println(str3) // "hello world"
}
free
函数是 c 的标准库里面的,cat
是顶部注释部分实现的一个函数,在 goland 中显示和操作这部分 c 代码还是很方便的清晰的。
网友评论