我对初始化包含映射的结构的最佳方法感到困惑。运行此代码将产生panic: runtime error: assignment to entry in nil map:
panic: runtime error: assignment to entry in nil map
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) }
另一个想法是使用一种add_connection可以在地图为空的情况下对其进行初始化的方法:
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) }
还有其他选择吗?只是想看看是否有一种普遍接受的方法。
我可能会使用构造函数来做到这一点:
func NewGraph() *Graph { var g Graph g.connections = make(map[Vertex][]Vertex) return &g }
我已经在标准image/jpeg包中找到了这个示例(虽然没有地图,但是有切片):
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} }