Go での文字列リテラルの参照
Go で文字列参照を取得すると、各呼び出しでのメモリ割り当てが回避され、パフォーマンスが向上します。ただし、以下の例の test1() で試行されているように、文字列リテラルへの参照を直接取得すると、問題が発生します。
var konnichiwa = `こんにちは世界` // Gives the compile error `cannot take the address of "Hello world"` func test1() (*string) { return &`Hello world` }
これはなぜ不可能ですか?
意味論があいまいなため、文字列リテラルのアドレスを取得することは禁止されています。この曖昧さは、参照が定数自体に適用されるか、定数のコピーに適用されるかに集中します。定数のアドレスを取得すると、値の変更が許可されてランタイム エラーが発生する可能性があります。
最良の解決策
test2() で示されているように、最も効果的な解決策は、文字列リテラルではなく、既存の変数へのポインターを使用します。このアプローチはより冗長ですが、Go の構文に準拠しており、明確なセマンティクスを保証します。
// Works fine func test2() (*string) { hej := `Hej världen` return &hej }
例外: 複合リテラル
言語仕様では、複合リテラルの例外を設けています。 test3() に示すように。これにより、匿名構造体の作成とその後のそのアドレスの取得が可能になります。
func test3() (*string) { return &struct { A int B int }{1, 2} }
この例外は存在しますが、静的文字列への参照を処理するための推奨されるアプローチは、単純さと明確さを維持するため、引き続き test2() です。 .
以上がGo で文字列リテラルのアドレスを取得できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。