Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 为什么在golang打印(无)地图会产生非&书信电报;零>&引用;结果如何?_Dictionary_Go_Null - Fatal编程技术网

Dictionary 为什么在golang打印(无)地图会产生非&书信电报;零>&引用;结果如何?

Dictionary 为什么在golang打印(无)地图会产生非&书信电报;零>&引用;结果如何?,dictionary,go,null,Dictionary,Go,Null,在golang中,如果创建的结构中包含未初始化的映射,则打印映射将生成非字符串 为什么零映射的“打印”输出“映射[]”,而不是 // 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))

在golang中,如果创建的结构中包含未初始化的映射,则打印映射将生成非
字符串

为什么零映射的“打印”输出“映射[]”,而不是

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

零指针与空(或零)映射不同。有关零值的权威信息,请参阅

如果需要nil,则需要一个指针,如下所示:

主程序包
进口(
“fmt”
)
func main(){
var myMap map[string]int64
fmt.Printf(“分配前的myMap:%v\n”,myMap)
myMap=make(map[string]int64)
fmt.Printf(“分配后的myMap:%v\n”,myMap)
var myMapPointer*map[string]int64
fmt.Printf(“分配前的myMapPointer:%v\n”,myMapPointer)
myMapPointer=new(映射[string]int64)
fmt.Printf(“分配后的myMapPointer:%v\n”,myMapPointer)
}
这使得:

myMap before assignment: map[]
myMap after assignment : map[]
myMapPointer before assignment: <nil>
myMapPointer after assignment : &map[]
分配前的myMap:map[] 分配后的myMap:map[] 分配前的myMapPointer: 分配后的myMapPointer:&map[]
这只是为了把事情弄清楚。如果运行此代码:

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

$ true
$ map[string]int64
所以在这一点上,
m
实际上是
nil
nil
值(can)也有一个类型,格式化程序在可能的情况下使用该类型打印出有意义的内容

map
的行为类似于其他语言中的引用类型。在Go中,您可以调用结构的方法,即使其值为
nil

因此,即使对于您自己的结构,您也可以通过在结构上定义
String()String
方法来实现
fmt.Stringer
接口,只要结构的值为
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映射中索引)@JimB这实际上就是答案,发布它。除了你引用的文档特别指出映射的零值是
nil