2017-02-27 7 views
0

私は(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])))) 

答えて

2

Go文字列の下のデータをコピーせずにCに取得する方法があります。それはC文字列ではないので、C文字列としては機能しません。あなたのprintfは、時にはうまく動作してもポインタを抽出することができたとしても動作しません。 Go文字列はC文字列ではありません。彼らは互換性のために使用されていましたが、もっと多くのlibcを使用しても、もう使用できません。

ちょうどcgoのマニュアルに従ってくださいC.CStringを使用してください。 Cと呼ばれるオーバーヘッドがメモリの割り当てや文字列のコピーよりもはるかに大きいので、効率のために戦っているのであればcgoを使わないだけで勝つことができます。

+0

最後のステートメントを再 - 「Cへの呼び出しのオーバーヘッドは、メモリの割り当てや文字列のコピーよりもはるかに大きい」 - それを裏付けるベンチマークはありますか? –

+0

@Not_a_Golfer実際、私はそうしています。 1年前から:https://github.com/art4711/cgo_overhead時間があれば、1.8に更新します。 – Art

+0

1.8用に更新されました。 1.8では、Go関数呼び出しと比較してcgo関数呼び出しを作成するのが92倍遅くても、36回遅くなりました。 – Art

関連する問題