Go语言变量的作用域

Python010

Go语言变量的作用域,第1张

2021-10-22

每一个变量(常量、类型或函数)在程序中都有一定的作用范围。称之为作用域。

Go语言在编译时会检查每一个变量是否使用过,未使用过的变量就会编译错误。

根据变量定义位置的不同,可以分为以下三个类型:

在函数体内被声明的变量称之为局部变量,作用在函数体内,函数的参数和返回值变量都属于局部变量。局部变量不会一直存在,在函数被调用时存在,函数调用结束后变量就会被销毁,即生命周期。

例子:其中a、b均为局部变量,只会在main函数内有效

在函数体外被声明的变量称之为全局变量,作用于所有源文件。不包含这个全局变量的源文件需要使用"import"关键字引入全局变量所在的源文件之后才能使用这个全局变量。

全局变量声明必须以 var 关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。

例如:global为全局在main2和main函数中都能使用

函数名后面的小括号里定义的变量, 用于接受来自调用函数的参数。用于接收调用该函数时传入的参数。

例如:下面的例子中,第十七行a、b为sum函数定义的形参,用于传入main函数中的AF、BF

衍生类型,interface{} , map, [] ,struct等

map类似于java的hashmap,python的dict,php的hash array。

常规的for循环,可以用for k,v :=range m {}. 但在下面清空有一个坑注意:

著名的map[string]*struct 副本问题

结果:

Go 中不存在引用传递,所有的参数传递都是值传递,而map是等同于指针类型的,所以在把map变量传递给函数时,函数对map的修改,也会实质改变map的值。

slice类似于其他语言的数组(list,array),slice初始化和map一样,这里不在重复

除了Pointer数组外,len表示使用长度,cap是总容量,make([]int, len, cap)可以预申请 比较大的容量,这样可以减少容量拓展的消耗,前提是要用到。

cap是计算切片容量,len是计算变量长度的,两者不一样。具体例子如下:

结果:

分析:cap是计算当前slice已分配的容量大小,采用的是预分配的伙伴算法(当容量满时,拓展分配一倍的容量)。

append是slice非常常用的函数,用于添加数据到slice中,但如果使用不好,会有下面的问题:

预期是[1 2 3 4 5 6 7 8 9 10], [1 2 3 4 5 6 7 8 9 10 11 12],但实际结果是:

注意slice是值传递,修改一下:

输出如下:

== 只能用于判断常规数据类型,无法使用用于slice和map判断,用于判断map和slice可以使用reflect.DeepEqual,这个函数用了递归来判断每层的k,v是否一致。

当然还有其他方式,比如转换成json,但小心有一些异常的bug,比如html编码,具体这个json问题,待后面在分析。