一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域。
Go语言会在编译时检查每个变量是否使用过,一旦出现未使用的变量,就会报编译错误。若是不能理解变量的作用域,可能会带来一些不明所以的编译错误。
根据变量定义位置的不同,分为以下三类:
* 函数内定义的变量称为局部变量;
* 函数外定义的变量称为全局变量;
* 函数定义中的变量称为形式参数。
## 局部变量
在函数体内声明的变量称之为`局部变量`,它们的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。
局部变量不是一直存在的,它只在定义它的函数被调用后存在,函数调用结束后这个局部变量就会被销毁。
```
package main
import (
"fmt"
)
func main() {
//声明局部变量 a 和 b 并赋值
var a int = 3
var b int = 4
//声明局部变量 c 并计算 a 和 b 的和
c := a + b
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c) // a = 3, b = 4, c = 7
}
```
## 全局变量
在函数体外声明的变量称之为`全局变量`,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用。当然,不包含这个全局变量的源文件需要使用`import`关键字引入全局变量所在的源文件之后才能使用这个全局变量。
**全局变量声明必须以 var 关键字开头**,若想在外部包中使用全局变量的**首字母必须大写**。
```
package main
import "fmt"
// 声明全局变量
var c int
func main() {
// 声明局部变量
var a, b int
// 初始化参数
a = 3
b = 4
c = a + b
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c) // a = 3, b = 4, c = 7
}
```
Go语言全局变量与局部变量名称可以相同,但是函数体内的局部函数会被有限考虑。
```
package main
import "fmt"
// 声明全局变量
var a float32 = 3.14
func main() {
// 声明布局变量
var a int = 3
fmt.Printf("a = %d\n", a) // a = 3
}
```
## 形式参数
在定义函数时函数名后面括号中的变量叫做形式参数(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值。
形式参数会作为函数的局部变量来使用。
```
package main
import "fmt"
// 全局变量 a
var a int = 13
func main() {
// 局部变量a和b
var a int = 3
var a int = 4
fmt.Printf("main() 函数中 a = %d\n", a)
fmt.Printf("main() 函数中 b = %d\n", b)
c := sum(a, b)
fmt.Printlf("main() 函数中 c = %d\n", c)
}
func sum(a, b int) int {
fmt.Ptrinf("sum() 函数中 a = %d\n", a)
fmt.Printf("sum() 函数中 b = %d\n" b)
return a + b
}
```
运行结果如下:
```
main() 函数中 a = 3
main() 函数中 b = 4
sum() 函数中 a = 3
sum() 函数中 b = 4
main() 函数中 c = 7
```
- 1.Go语言前景
- 2.Go语言环境搭建
- 3.Go语言的基本语法
- 3.1变量
- 3.1.1变量声明
- 3.1.2变量初始化
- 3.1.3多个变量同时赋值
- 3.1.4匿名变量
- 3.1.5变量的作用域
- 3.1.6整型
- 3.1.7浮点类型
- 3.1.8复数
- 3.1.9bool类型
- 3.1.10字符串
- 3.1.11字符类型
- 3.1.12类型转换
- 3.2常量
- 3.1.1const关键字
- 3.2.2模拟枚举
- 4.Go语言的流程控制
- 4.2循环结构
- 4.3键值循环
- 4.4switch语句
- 4.5goto语句
- 4.6break语句
- 4.7continue语句
- 5.Go语言的函数
- 5.1函数声明
- 5.2函数变量
- 5.3函数类型实现接口
- 5.4闭包
- 5.5可变参数
- 5.6defer(延迟执行语句)
- 5.7处理运行时错误
- 5.8宕机(panic)
- 5.9宕机恢复(recover)
- 5.10Test功能测试函数
- 6.Go语言的内置容器
- 6.1数组
- 6.2切片
- 6.3map
- 6.4sync.Map
- 6.5list
- 6.6range
- 7.Go语言的结构体
- 8.Go语言的接口
- 9.Go语言的常用内置包
- 10.Go语言的并发
- 11.Go语言的文件I/O操作
- 12.Go语言的网络编程
- 13.Go语言的反射
- 14.Go语言的数据库编程
- 15.Go语言密码学算法
- 16.Go语言的gin框架
- 17.Go语言的网络爬虫
- 18.Go语言的编译和工具链