我正在尝试在Go中使用C库。 C.PrlFoundVmInfo_GetName
函数将UTF-8编码的字符串写入名称,长度为 nBufSize 。
// PRL_CHAR sName[1024];
var sName [1024]C.PRL_CHAR
// PRL_UINT32 nBufSize = sizeof(sName);
var nBufSize C.PRL_UINT32 = C.PRL_UINT32(unsafe.Sizeof(sName))
ret = C.PrlFoundVmInfo_GetName(hFoundVmInfo, (*C.PRL_CHAR)(unsafe.Pointer(&sName)), &nBufSize)
// printf("VM name: %s\n", sName);
var gName string = C.GoString((*C.char)(unsafe.Pointer(&sName)))
fmt.Printf("VM %d name: \"%s\"\n", nBufSize, gName)
声明名称(以及 nBufSize )的正确方法是什么?如何将名称转换为Go 字符串< / em>的?上面的代码没有像我期望的那样工作。它打印:
VM 1024 name: ""
...
PrlFoundVmInfo_GetName - 参数
PRL_RESULT PrlFoundVmInfo_GetName(
PRL_HANDLE handle,
PRL_STR sName,
PRL_UINT32_PTR pnNameBufLength
);
答案 0 :(得分:3)
一些特殊功能通过制作转换Go和C类型 数据副本。在伪Go定义中:
// C string, length to Go string func C.GoStringN(*C.char, C.int) string
答案 1 :(得分:0)
这是解决方案,创建一个字节数组并使 sName 指向它。使用后,使用C.GoStringN
将内容转换为Go字符串。
var buf = make([]byte, 1024)
var sName C.PRL_STR = (C.PRL_STR)(unsafe.Pointer(&buf))
var nBufSize C.PRL_UINT32 = 1024
ret = C.PrlFoundVmInfo_GetName(*hFoundVmInfo, sName, &nBufSize)
gName := C.GoStringN((*_Ctype_char)(unsafe.Pointer(sName)), C.int(nBufSize))
fmt.Printf("VM %d name: \"%s\"\n", nBufSize, gName)