在golang中,如果你创建一个带有地图的结构,这个结构是未初始化的,那么打印地图会产生一个非<nil>
字符串。
为什么&#34;打印&#34; nil map输出&#34; map []&#34;而不是<nil>
?
// Assume above there is a struct, a.AA, which is created but which otherwise
// has not created the map.
//output:
//map[]
//map[]
fmt.Println(a.AA)
fmt.Println(make(map[string]int64))
答案 0 :(得分:2)
这只是为了让事情变得清晰。如果您运行此代码:
var m map[string]int64
log.Println(m == nil)
log.Printf("%T\n", m)
它将打印:
$ true
$ map[string]int64
此时m
实际上是nil
。 nil
值(可以)也有类型,并且formater使用它来在可能的情况下打印出有意义的内容。
map
是参考类型。在Go中,即使它的值为nil
,也可以调用结构的方法。
因此,即使对于您自己的结构,只需在结构上定义fmt.Stringer
方法以及结构的值为String() string
时,您就可以实现 nil
接口你可以打印出比<nil>
更合适的东西。具有:
type someData struct {
someValue string
}
func (x *someData) String() string {
if x == nil {
return "NO PROPER DATA HERE!"
}
return x.someValue
}
然后如果我们跑:
var data *someData
log.Println(data)
data = new(someData)
data.someValue = "Aloha! :)"
log.Println(data)
输出将是:
$ NO PROPER DATA HERE!
$ Aloha! :)
在第一行看到我们没有得到<nil>
作为输出,尽管我们的结构指针在那时是nil
。
答案 1 :(得分:0)
nil指针与空(或零)映射不同。有关零值的权威信息,请参见https://golang.org/ref/spec#The_zero_value。
如果你想要一个nil,你需要一个指针,例如下面的example:
package main
import (
"fmt"
)
func main() {
var myMap map[string]int64
fmt.Printf("myMap before assignment: %v\n", myMap)
myMap = make(map[string]int64)
fmt.Printf("myMap after assignment : %v\n", myMap)
var myMapPointer *map[string]int64
fmt.Printf("myMapPointer before assignment: %v\n", myMapPointer)
myMapPointer = new(map[string]int64)
fmt.Printf("myMapPointer after assignment : %v\n", myMapPointer)
}
这给出了:
myMap before assignment: map[]
myMap after assignment : map[]
myMapPointer before assignment: <nil>
myMapPointer after assignment : &map[]