如何获取字符串变量的数据指针?

时间:2017-02-27 07:20:28

标签: pointers go cgo

我想获取字符串变量的数据指针(如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]))))

1 个答案:

答案 0 :(得分:2)

有一些方法可以将Go字符串中的基础数据传输到C而不复制它。它不能用作C字符串,因为它不是C字符串。即使你设法提取指针,你的printf也无法工作,即使它有时会发生。 Go字符串不是C字符串。当Go使用更多libc时,它们曾经是兼容性,它们已不再存在。

只需按照cgo手册操作即可使用C.CString。如果你正在为提高效率而奋斗,你只需要不使用cgo就可以赢得更多,因为调用C的开销比分配一些内存和复制字符串要大得多。