在go语言中,我们介绍过,可以把一些变量放在一个var组里面进行编写,例如:
var( a=1 b=2 c=3 d=4 )
像上诉的声明的话都是比较简单的,遇到复杂的话,我们经常会涉及到如下所示:
var( a = b+c b=f() c=f() d=3 )
此时编写java语言习惯的同学都知道,这里声明的顺序有问题,首先b和c变量是没有声明的,此时使用的话就会报错,如下图:
但是在go语言里面没有这样的限制,他会进行全局查找,也就是我们提前使用b和c,我们可以再后面再对b和c进行赋值,这样子编译器不会报错,执行的时候也不会报错。如下图:
因此我们得出第一个结论:
在go语言里面声明变量的顺序可以随意调整,不一定按照日常的使用习惯顺序来进行顺序声明
接着我们介绍下关于go语言里面的赋值信息,在go语言里面进行赋值的话,他其实也是一个有向无环图,他会首先从无环图的末端进行初始化,例如上面我们首先初始化a,发现b和c还未初始化,那么他会继续寻找b和c,结果看到b和c里面的d值还没初始化,接着他继续循环,终于找到了d的值,这就是第一轮初始化:
这时在第一轮的循环中,其实相当于只初始化了d的值,此时得到的是:【d=3】
接着go语言继续第二轮的初始化,首先初始化a,发现b和c还未初始化,那么他会继续寻找b和c,此时发现d已经初始化了,所以调用f方法成功,初始化成功b,然后继续找c,发现可以调用f方法,所以C也初始化了,这就是第二轮的初始化:
这时在第二轮的循环中,其实相当于初始化了b,c的值,此时得到的是:【b=4,c=5,d=5】
接着go语言继续第三轮的初始化,首先初始化a,发现b和c都已经初始化了,所以直接初始化a即可,这就是第三轮初始化:
这时在第三轮的循环中,会初始化a的值,此时得到的是:【a=9,b=4,c=5,d=5】
这是不是有点像spring的初始化依赖,这些初始化都是有向无环图,首先从末端倒着初始化即可。
扩展:
可能有同学会问:这里d不应该是3吗?其实答案理论上应该是3,但是在f方法里面执行了两边d++,所以变成了5。不管是go语言和其他语言,都可以试试,最后的结果是一样的。
还没有评论,来说两句吧...