为什么在戈朗打印(零)地图会产生非"<nil>"的结果?



在Golang中,如果您在其中创建一个带有映射的结构,该结构是非初始化的,则打印地图会产生非<nil>字符串。

为什么"打印"零映射输出"映射" []"而不是<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))

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

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

它将打印:

$ true
$ map[string]int64

因此,m实际上是nilnil值(can)也有一种类型,formater在可能的情况下使用它来打印出有意义的东西。

a map的行为就像其他语言中的参考类型。在Go中,您可以调用结构的方法的值,即使其值为nil

因此,即使对于自己的结构,您也可以通过在结构上定义 String() string方法来实现 fmt.Stringer接口,只要您的struct的值为 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

nil指针与空(或零)映射不同。请参阅https://golang.org/ref/spec#the_zero_value有关零值的权威信息。

如果您想要一个零,则需要一个指针,例如在以下示例中:

package main
import (
    "fmt"
)
func main() {
    var myMap map[string]int64
    fmt.Printf("myMap before assignment: %vn", myMap)
    myMap = make(map[string]int64)
    fmt.Printf("myMap after assignment : %vn", myMap)
    var myMapPointer *map[string]int64
    fmt.Printf("myMapPointer before assignment: %vn", myMapPointer)
    myMapPointer = new(map[string]int64)
    fmt.Printf("myMapPointer after assignment : %vn", myMapPointer)
}

这给出了:

myMap before assignment: map[]
myMap after assignment : map[]
myMapPointer before assignment: <nil>
myMapPointer after assignment : &map[]

相关内容

  • 没有找到相关文章

最新更新