在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
实际上是nil
。 nil
值(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[]