在 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) }
发生此错误是因为在尝试访问其连接映射时连接映射为零
解决方案:构造函数
一个推荐的解决方案是创建一个构造函数,如下所示:
func NewGraph() *Graph { var g Graph g.connections = make(map[Vertex][]Vertex) return &g }
此函数返回一个具有初始化连接图的新 Graph 实例。
解决方案: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) }
此方法在添加连接之前检查映射是否为 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中文网其他相关文章!