- Go语言入门
- Go语言开发环境安装配置
- Go语言程序结构
- Go语言基础语法
- Go语言数据类型
- Go语言变量
- Go语言常量
- Go语言运算符
- Go语言条件和决策
- Go语言循环
- Go语言函数
- Go语言作用域规则
- Go语言字符串
- Go语言数组
- Go语言指针
- Go语言结构体
- Go语言切片
- Go语言范围(range)
- Go语言映射
- Go语言递归
- Go语言类型转换
- Go语言接口
- Go语言错误处理
-
Go编程代码实例
- Hello World程序实例
- Go变量实例
- Go常量实例
- Go for循环语句实例
- Go if/else语句实例
- Go switch语句实例
- Go切片实例
- Go范围实例
- Go函数实例
- Go函数多个返回值实例
- Go可变参数的函数实例
- Go闭包(匿名函数)实例
- Go函数递归实例
- Go指针实例
- Go指针实例
- Go接口实例
- Go错误实例
- Go程序实例
- Go通道实例
- Go通道缓冲实例
- Go通道同步实例
- Go通道路线实例
- Go Select实例
- Go超时(timeouts)实例
- Go非阻塞通道操作实例
- Go关闭通道实例
- Go通道范围实例
- Go计时器实例
- Go断续器实例
- Go工作池实例
- Go速率限制实例
- Go原子计数器实例
- Go互斥体实例
- Go有状态的goroutines实例
- Go排序实例
- Go按自定义函数排序实例
- Go panic错误处理实例
- Go延迟(defer)实例
- Go集合函数实例
- Go字符串函数实例
- Go字符串格式化实例
- Go正则表达式实例
- Go JSON实例
- Go时间日期实例
- Go时代(Epoch)实例
- Go时间格式化/解析实例
- Go随机数实例
- Go数字解析实例
- Go URL解析实例
- Go SHA1哈希实例
- Go Base64编码实例
- Go读取文件实例
- Go写文件实例
- Go行过滤器实例
- Go命令行参数实例
- Go命令行标志实例
- Go环境变量实例
- Go执行过程实例
- Go信号实例
- Go退出程序实例
Go语言作用域规则
任何编程中的作用域是程序的一个区域,它定义了变量可以存在,并且在超出该变量范围不能被访问。 在Go编程语言中有三个可以声明变量的地方:
- 在函数或块中声明的为局部变量。
- 在所有函数之外声明的变量称为全局变量。
- 在定义函数参数变量时,称为形参。
下面来看看什么是局部变量和全局变量,以及什么是形式参数。
局部变量
在函数或块中声明的变量称为局部变量。 它们只能由在函数或代码块中的语句使用。局部变量对于它们自己以外的函数是未知的。以下是使用局部变量的示例。这里所有的变量a
,b
和c
都是main()
函数的局部变量。
package main import "fmt" func main() { /* local variable declaration */ var a, b, c int /* actual initialization */ a = 10 b = 20 c = a + b fmt.Printf ("value of a = %d, b = %d and c = %d\n", a, b, c) }
当上述代码编译和执行时,它产生以下结果:
value of a = 10, b = 20 and c = 30
全局变量
全局变量在函数之外定义,通常在程序之上。 全局变量将在程序的整个生命周期中都有保持它的值,并且可以在程序定义的任何函数内访问到它们。
全局变量可以通过任何函数访问。 也就是说,一个全局变量可以声明后在整个程序中使用。 以下是使用全局变量和局部变量的示例:
package main import "fmt" /* global variable declaration */ var g int func main() { /* local variable declaration */ var a, b int /* actual initialization */ a = 10 b = 20 g = a + b fmt.Printf("value of a = %d, b = %d and g = %d\n", a, b, g) }
当上述代码编译和执行时,它产生以下结果:
value of a = 10, b = 20 and g = 30
在程序中,局部变量和全局变量的名称可以相同,但函数内部的局部变量的值将优先(也就是说局部变量会覆盖全局变量)。 以下是一个示例:
package main import "fmt" /* global variable declaration */ var g int = 20 func main() { /* local variable declaration */ var g int = 10 fmt.Printf ("value of g = %d\n", g) }
当上述代码编译和执行时,它产生以下结果:
value of g = 10
形式参数
函数参数 - 形式参数在函数中会作为局部变量,它们将优先于全局变量。以下是一个示例:
package main import "fmt" /* global variable declaration */ var a int = 20; func main() { /* local variable declaration in main function */ var a int = 10 var b int = 20 var c int = 0 fmt.Printf("value of a in main() = %d\n", a); c = sum( a, b); fmt.Printf("value of c in main() = %d\n", c); } /* function to add two integers */ func sum(a, b int) int { fmt.Printf("value of a in sum() = %d\n", a); fmt.Printf("value of b in sum() = %d\n", b); return a + b; }
当上述代码编译和执行时,它产生以下结果:
value of a in main() = 10 value of a in sum() = 10 value of b in sum() = 20 value of c in main() = 30
初始化局部变量和全局变量
当一个局部变量作为全局变量被初始化为它们对应的零值时。指针初始化为nil
。
数据类型 | 初始默认值 |
---|---|
int | 0 |
float32 | 0 |
指针 | nil |