私は(C++での文字列のような:: c_str())文字列変数のデータポインタを取得したいと私は、これは動作しませんが見つかりました:文字列変数のデータポインタをどのように取得できますか?交流機能に渡す
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]'のアドレスを取ることができません。 これは問題ありませんが、不必要なメモリが発生することは考えられません。データポインタを取得するより良い方法はありますか?
C.Println((*C.char)(unsafe.Pointer(&([]byte(s)[0]))))
最後のステートメントを再 - 「Cへの呼び出しのオーバーヘッドは、メモリの割り当てや文字列のコピーよりもはるかに大きい」 - それを裏付けるベンチマークはありますか? –
@Not_a_Golfer実際、私はそうしています。 1年前から:https://github.com/art4711/cgo_overhead時間があれば、1.8に更新します。 – Art
1.8用に更新されました。 1.8では、Go関数呼び出しと比較してcgo関数呼び出しを作成するのが92倍遅くても、36回遅くなりました。 – Art