Go 構造体内でのマップの初期化
構造体内でのマップの初期化は、混乱を招く作業になる可能性があります。この記事では、この問題に対処するためのさまざまなアプローチを検討します。
問題: ランタイム エラー
構造体内でマップを初期化しようとすると、次のコードを実行するとランタイム エラーが発生する可能性があります。エラー:
package main type Vertex struct { label string } type Graph struct { connections map[Vertex][]Vertex } func main() { v1 := Vertex{"v1"} v2 := Vertex{"v2"} g := new(Graph) g.connections[v1] = append(g.coonections[v1], v2) g.connections[v2] = append(g.connections[v2], v1) }
このエラーは、接続マップにアクセスしようとしたときに接続マップが nil であるために発生します。
解決策: コンストラクター
推奨される解決策の 1 つは、次に示すようにコンストラクター関数を作成することです。
func NewGraph() *Graph { var g Graph g.connections = make(map[Vertex][]Vertex) return &g }
この関数は、初期化された接続マップを持つ新しいグラフ インスタンス。
解決策: add_connectionメソッド
もう 1 つのオプションは、空の場合にマップを初期化する add_connection メソッドを実装することです。
func (g *Graph) add_connection(v1, v2 Vertex) { if g.connections == nil { g.connections = make(map[Vertex][]Vertex) } g.connections[v1] = append(g.connections[v1], v2) g.connections[v2] = append(g.connections[v2], v1) }
このメソッドは、マップが nil かどうかを確認し、必要に応じて接続を追加する前に初期化します。 .
標準の例ライブラリ
標準ライブラリは、image/jpeg パッケージのコンストラクターを使用してスライスで構造体を初期化する例を提供します。
type Alpha struct { Pix []uint8 Stride int Rect Rectangle } func NewAlpha(r Rectangle) *Alpha { w, h := r.Dx(), r.Dy() pix := make([]uint8, 1*w*h) return &Alpha{pix, 1 * w, r} }
全体として、初期化方法の選択は依存します。特定のユースケースについて。コンストラクターは適切な初期化を保証する便利な方法を提供し、メソッドは例外的なケースをより柔軟に処理できます。
以上がGo 構造体内でマップを適切に初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。