ホームページ >バックエンド開発 >Golang >Go で文字列リテラルのアドレスを取得できないのはなぜですか?

Go で文字列リテラルのアドレスを取得できないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-10 01:00:11328ブラウズ

Why Can't I Take the Address of a String Literal in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。