为什么在golang中打印(nil)映射会产生非&#34; <nil>&#34;结果?

时间:2016-12-11 19:01:04

标签: dictionary go null

在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))

2 个答案:

答案 0 :(得分:2)

这只是为了让事情变得清晰。如果您运行此代码:

var m map[string]int64
log.Println(m == nil)
log.Printf("%T\n", m)

它将打印:

$ true
$ map[string]int64

此时m实际上是nilnil值(可以)也有类型,并且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[]