首页 > 后端开发 > Golang > 如何在 Go 结构中正确初始化映射?

如何在 Go 结构中正确初始化映射?

DDD
发布: 2024-12-09 22:12:28
原创
900 人浏览过

How to Properly Initialize Maps within Go Structs?

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板