我想获取字符串变量的数据指针(如c ++中的string :: c_str())传递给c函数,我发现这不起作用:
package main
/*
#include <stdio.h>
void Println(const char* str) {printf("%s\n", str);}
*/
import "C"
import (
"unsafe"
)
func main() {
s := "hello"
C.Println((*C.char)(unsafe.Pointer(&(s[0]))))
}
编译错误信息是:&#39;不能取s [0]&#39;的地址。 这样就可以了,但我怀疑它会导致不必要的记忆。有没有更好的方法来获取数据指针?
C.Println((*C.char)(unsafe.Pointer(&([]byte(s)[0]))))
答案 0 :(得分:2)
有一些方法可以将Go字符串中的基础数据传输到C而不复制它。它不能用作C字符串,因为它不是C字符串。即使你设法提取指针,你的printf也无法工作,即使它有时会发生。 Go字符串不是C字符串。当Go使用更多libc时,它们曾经是兼容性,它们已不再存在。
只需按照cgo手册操作即可使用C.CString
。如果你正在为提高效率而奋斗,你只需要不使用cgo就可以赢得更多,因为调用C的开销比分配一些内存和复制字符串要大得多。