CGO を使用して Go 文字列を C char* ポインターにコピーする
Go の領域では、シームレスに交換する必要がある状況に遭遇することがあります。 Go コードと C ライブラリまたはアプリケーション間のデータ。そのようなシナリオの 1 つは、CGO の機能を使用して Go 文字列を C 文字ポインター (char *) に転送することです。
課題:
Go をコピーしたいという欲求が生じます。 CGO の魔法の機能を使用して、文字列を char * に変換します。疑問は残ります: これは次のアプローチを使用して達成できますか?
func copy_string(cstr *C.char) { str := "foo" C.GoString(cstr) = str }
解決策:
意図は崇高ですが、コード スニペットで示されているアプローチは当てはまりません。短い。 CGO の公式ドキュメントによると、Go 文字列を C 文字列に変換する正しい方法には、C.CString 関数を利用することが含まれます。
cstr = C.CString(str)
C.CString は強制的にメモリを割り当てることに留意することが重要です。あなた。ただし、この記憶は自動的に解放されるわけではなく、ユーザーの勤勉な努力に委ねられます。この状況を修正するには、C.free:
C.free(unsafe.Pointer(cstr))
を明示的に呼び出して、割り当てられたメモリを手動で解放する必要があります。このアプローチを採用することで、割り当てられたメモリが適切に破棄され、メモリ リークが発生することを回避できます。そうしないと、コードに問題が発生します。
以上がCGO を使用して Go 文字列を C char* ポインターに安全にコピーするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。