GO 语言结构体里定义 map 字段,使用时如何自动初始化?

作者站长头像
站长
· 阅读数 5

例如我有这样一个结构体

type Trie struct {
    isEnd    bool
    children map[rune]*Trie
}

当我初始化一个 Trie 变量,当他的某个 child 为空时为它赋值时会报错 panic: assignment to entry in nil map

root := Trie{}
    
if root.children['a'] == nil {
    root.children['a'] = &Trie{}
}

对于这种情况,难道我每次赋值前都要先检查 map 是否被初始化了吗?如下:

root := Trie{}
    
if len(root.children) == 0 {
    root.children = map[rune]*Trie{}
}
    
if root.children['a'] == nil {
    root.children['a'] = &Trie{}
}

有没有更优雅的语法或做法,让为结构体的 map 赋值时自动初始化?

回复
1个回答
avatar
test
2024-07-08

go 的一般做法是定义一个 NewTrie:

func NewTrie() *Trie {
    return &Trie{
        true,
        map[rune]*Trie{}
    }
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容