当以下代码:
m := make(map[string]string)
if m == nil {
log.Fatal("map is empty")
}
当程序运行时,log语句不执行,而fmt.Println(m)
则表明该map为空:
map[]
len
:if len(m) == 0 {
....
}
来自 https://golang.org/ref/spec#Length_and_capacity
len(s) map[K]T 映射长度(定义键的数量)
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 是否为空。 - supera
和 *a
都不是未初始化的,那么它们肯定已经被赋值了。new()
分配的内存并不会 初始化,但是会将其 清零。请参考 https://go.dev/doc/effective_go#allocation_new 。映射的零值等于 nil
。在某些方面,它的行为类似于空映射:您可以使用 len()
检查其大小,循环遍历它(不会执行循环体),删除条目(不会做任何事情),打印它(将打印 map[]
)等。但是,试图添加一个条目将导致 panic。 - jcsahnwaldt Reinstate Monica*a
未初始化,但它处于定义良好的状态并且可用,例如用于len(*a)
。这与像C这样的语言非常不同,那里的“未初始化”意味着“在初始化之前完全无法使用”。 - jcsahnwaldt Reinstate Monica
nil
,也可以被初始化并且里面有 0 值。 这是两种不同的情况! - Cirelli94