在《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并发编程实战》,如果有一起看的读者可以一起来交流。----这本书文字太多了,有点烧脑,分分钟看不下去。
作为一个有点二的策划,我总会不经意得去在意别人习以为常的地方,所以在这里我还要分享一点小知识:
网友评论