Go スライス範囲の動作を理解する
Go では、スライスは要素の効率的かつ動的なストレージを提供する基本的なデータ構造です。スライスを操作するときは、範囲ループの動作を理解することが重要です。
次のコード スニペットを考えてみましょう。
type student struct { Name string Age int } func main() { m := make(map[string]*student) s := []student{ {Name: "Allen", Age: 24}, {Name: "Tom", Age: 23}, } for _, stu := range s { m[stu.Name] = &stu } fmt.Println(m) for key, value := range m { fmt.Println(key, value) } }
このコードは、スチューデント構造体のスライスとマップを定義します。範囲ループを使用してスライスを反復し、各要素が変数 'stu' に割り当てられます。ただし、予期しない動作が観察され、すべてのマップ エントリがスライス内の同じアドレスをポイントしています。
根本原因:
問題は範囲ループの割り当てに起因します。変数「stu」に。ループが反復されると、「stu」にはそのインデックスのスライス要素のコピーが割り当てられます。その結果、すべてのマップ エントリは同じコピーされた値を参照します。
解決策:
この動作を解決するには、コードで各スライスのアドレスを明示的に取得する必要があります。要素をマップに保存する前に:
for i := range s { m[s[i].Name] = &s[i] }
この変更を行うことにより、各マップ エントリは実際のスライス要素のアドレスを参照するようになり、予想される動作。これは、スライス範囲ループの微妙な違いと、それが Go でのデータ操作にどのような影響を与えるかを理解することの重要性を示しています。
以上がGo のスライス範囲ループはマップのアドレス割り当てにどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。