如何在Golang中检查地图是否为空?

96

当以下代码:

m := make(map[string]string)
if m == nil {
    log.Fatal("map is empty")
}

当程序运行时,log语句不执行,而fmt.Println(m)则表明该map为空:

map[]

2
这个问题有很多赞,但我认为这里有一点误解: 一个 map 可以是 nil,也可以被初始化并且里面有 0 值。 这是两种不同的情况! - Cirelli94
2个回答

210

24
对于那些想知道复杂度的人,它是O(1)。这是实现方法。 - Slava Bacherikov

2
下面的示例演示了检查地图是否为空时可以使用的nil检查和长度检查。
package main

import (
    "fmt"
)

func main() {
    a := new(map[int64]string)
    if *a == nil {
        fmt.Println("empty")
    }
    fmt.Println(len(*a))
}

打印

empty
0

new(map[int64]string) 返回一个未初始化的指向 map 的指针。你不能使用它来检查 map 是否为空。 - super
1
@Mradul,你不需要指向映射或切片的指针:它们已经是指针了! - Alessandro Argentieri
@super 既然 a*a 都不是未初始化的,那么它们肯定已经被赋值了。new() 分配的内存并不会 初始化,但是会将其 清零。请参考 https://go.dev/doc/effective_go#allocation_new 。映射的零值等于 nil。在某些方面,它的行为类似于空映射:您可以使用 len() 检查其大小,循环遍历它(不会执行循环体),删除条目(不会做任何事情),打印它(将打印 map[])等。但是,试图添加一个条目将导致 panic。 - jcsahnwaldt Reinstate Monica
也许可以说*a未初始化,但它处于定义良好的状态并且可用,例如用于len(*a)。这与像C这样的语言非常不同,那里的“未初始化”意味着“在初始化之前完全无法使用”。 - jcsahnwaldt Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接