有时候为节约内存用了 C.CBytes 函数,这不往坑里跑了。c 里面字符串都是要以数字 0 结尾的。
为节约内存,想使用 C.CBytes 直接到 c 的 char *类型。但是有问题
package main
// #include <string.h>
import "C"
import (
"fmt"
)
func main() {
b := []byte("我是小妖怪,逍遥又自在,杀人不眨眼,吃人不放盐。")
bs := string(b)
p := C.CBytes(b)
fmt.Printf("%d:%d:%d\n", int(C.strlen((*C.char)(p))), len(b), int(C.strlen((*C.char)(C.CString(bs)))))
}
// 输出
// Cbytes.strlen(75): len(72):CString.strlen(72)
发现长度不对
既然 C.Bytes 这条路走不同,换个思路,用类型强转吧 []byte->string。再使用 C.CString 不就得了
// #include <string.h>
import "C"
import (
"fmt"
"unsafe"
)
func main() {
b := []byte("我是小妖怪,逍遥又自在,杀人不眨眼,吃人不放盐。")
bs := *(*string)(unsafe.Pointer(&b))
p := C.CString(bs)
fmt.Printf("strlen(%d)\n", C.strlen((*C.char)(p)))
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.