2017-02-27 125 views
0

我希望得到一個字符串變量的數據指針(如字符串:: 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])))) 
} 

編譯錯誤信息是: '不能取s [0]的地址。 這將是我確定但我懷疑它會導致不必要的記憶apllying。有沒有更好的方法來獲取數據指針?

C.Println((*C.char)(unsafe.Pointer(&([]byte(s)[0])))) 

回答

2

有許多方法可以將底層數據從Go字符串獲取到C而無需複製它。它不會用作C字符串,因爲它不是C字符串。即使您設法提取指針,即使它有時會發生作用,您的printf也不會工作。 Go字符串不是C字符串。當Go使用更多的libc時,他們曾經是爲了兼容性,他們現在不在了。

只需按照cgo手冊並使用C.CString即可。如果你爲提高效率而奮鬥,只需不使用cgo就可以贏得更多,因爲調用C的開銷比分配內存和複製字符串要大得多。

+0

重申您的最後一個陳述 - 「調用C的開銷比分配內存和複製字符串要大得多」 - 您有任何基準支持它嗎? –

+0

@Not_a_Golfer其實我是。從一年前開始:https://github.com/art4711/cgo_overhead如果我有時間,我會更新到1.8。 – Art

+0

已更新爲1.8。在1.8版本中,與Go函數調用相比,它慢36倍,而不是製作cgo函數調用的92倍。 – Art

相關問題