美文网首页程序员开源工具技巧
《Go并发编程实战》之map的打印疑问及解惑

《Go并发编程实战》之map的打印疑问及解惑

作者: 大雁儿 | 来源:发表于2017-01-05 13:26 被阅读57次

    在《Go并发编程实战》一书的第16页,有一个关于函数初始化的例子,我在运行后发现与书中作者给出的结果不一样,存在疑问,特此记录,以便日后看书时思考。

    以上是书中的完整程序代码,和输出的结果以及解释。

    我把相同的程序输入gogland后重建运行出来的结果如下图所示

    思考一:为什么%v被原样输出了,而没有被m的结果值替换?

    这个问题在我改变输出后得到了解决,大家请继续往后看

    思考二:为什么会在Map:和其结果之间进行换行?

    按照书写的格式fmt.Println("Map:%v\n",m),应该是在输出结果结束后换后,但是实际上在结果之前就给换行了,这是什么原因呢?

    思考三:这个init,到底起到一个什么样的初始化作用呢?

    package main

    import(

    "fmt"

    "runtime"

    )

    //func init()  {

    //    fmt.Println("Map:%v\n",m)

    //

    //    info=fmt.Sprintf("OS:%s,Arch:%s",runtime.GOOS,runtime.GOARCH)

    //}

    var m =map[int]string{1:"A",2:"B",3:"C"}

    //var m map[int]string=map[int]string{1:"A",2:"B",3:"C"}

    var info string

    func main()  {

    fmt.Println("Map:%v\n",m)

    //info=fmt.Sprintf("OS:%s,Arch:%s",runtime.GOOS,runtime.GOARCH)

    fmt.Println("OS:%s,Arch:%s",runtime.GOOS,runtime.GOARCH)

    //fmt.Println(info)

    }

    把程序修改一下,不使用init初始化,也不使用fmt.Sprintf,而是直接输出操作系统&运行架构,结果又变了:

    是的,直接输出的话%v、%s都不会被替换掉

    这个原因是因为使用了Println

    再换一下,如果使用Printf,那么对应的变量会被替换

    以上代码输出的结果是:

    恩,这其实是接近我推断的一个结果了。

    通过以上的改变,还是没能解决我心中最大的一个疑问,map是数据类型,为什么会出现在结果中?这也是我目前还没能解决的问题,只能慢慢看书慢慢解决了。

    另外还有一个问题,运行后,map输出排序是会打乱的

    原值中的逗号没有输出。


    咨询了前辈后,以上的疑惑统统都解开了。

    先回答map类型,这是一个哈希序列,是无序的,所以输出的结果会出现打乱的情况。

    为什么m的输出会变成map[],这个是go的打印决定的,代码中可以通过debug查看其底层编码:

    在Go语言中mapString的值就带了map[的,结束时会按照map进行打印。


    最近会一直看这本《Go并发编程实战》,如果有一起看的读者可以一起来交流。----这本书文字太多了,有点烧脑,分分钟看不下去。

    作为一个有点二的策划,我总会不经意得去在意别人习以为常的地方,所以在这里我还要分享一点小知识:

    Arch是指cpu架构

    而打印出来的amd64则是架构中的一种 就是我们平时比较常说的64位

    相关文章

      网友评论

        本文标题:《Go并发编程实战》之map的打印疑问及解惑

        本文链接:https://www.haomeiwen.com/subject/flkzvttx.html