1. 全局/局部变量:
①. 全局变量:
a. C和Go语言中,定义在函数外面的就是全局变量.
②. 局部变量:
a. C和Go语言中,写在{}中、函数中、函数的形参,就是局部变量.
b. 只能在{}里面有效.
2. 作用域:
①. 全局变量:
a. C语言中,全局变量的作用域是从定义的那一行开始,直到文件末尾为止.
b. Go语言中的只要定义了全局变量,在定义前、后都可以使用.
c. 全局变量在任何地方都可以进行使用.
d. main包里定义的全局变量别的包是无法引用的.
②. 局部变量:
a. C和Go语言中,局部变量的作用域是,从定义的那一行开始,直到}结束或遇到return为止.
b. 执行到定义的那句话,开始分配内存空间,离开作用域自动进行释放.
c. 不同的作用域,允许定义同名的变量.
d. 使用变量的原则为就近原则,如果局部变量没有,就去全局变量中找.
3. 生命周期:
①. 全局变量:
a. C和Go语言中,只要程序一启动就会分配存储空间,只有程序关闭才会释放存储空间.
b. C语言的全局变量存储在静态区(数据区)
②. 局部变量:
a. C和Go语言中,局部变量只有执行了才会分配存储空间,只要离开作用域就会自动释放.
b. C语言的局部变量存储在栈区.
4. 注意点:
①. 全局变量:
a. 在C语言中相同的作用域内,可以出现同名的全局变量.
b. 在Go语言中相同的作用域内,不能出现同名的全局变量.
②. 局部变量:
a. 在C语言中相同的作用域内,不能出现同名的局部变量.
b. Go语言中相同干的作用域内,不能出现同名的局部变量.
5. 特殊点:
①. 在C语言中局部变量没有初始化存储的是垃圾数据,在Go语言中局部变量没有初始化,会默认初始化为0.
②. C和Go语言中,全局变量没有初始化存储的是0.
a. Go语言有零值的概念.
③. 在Go语言中,定义了没有使用:
a. 如果定义了一个局部变量,但是没有使用,编译会报错.
b. 如果定义了一个全局变量,但是没有使用,编译不会报错.
6. 总结:
①. 相同的作用域内,无论是全局变量还是局部变量,都不能出现同名的变量.
②. 变量离开作用域就不能使用.
③. 局部变量如果没有使用, 编译会报错, 全局变量如果没有使用, 编译不会报错.
④. :=只能用于局部变量, 不能用于全局变量.