[TOC]
函数和变量都是有生命周期的。
- 当函数被调用者执行完后,函数都销毁掉。
- 函数创建的变量,也是函数执行完被销毁掉。
- `for、if` 语法,创建的变量,也是语句块执行完被销毁掉。
变量分为:全局变量、局部变量
- 全局变量:定义在函数外部的变量,它在程序整个运行周期内都有效。 在函数中可以访问到全局变量。
- 局部变量:局部变量又分为两种
1. 函数内定义的变量无法在该函数外使用。
2. `for、if` 语句块的变量,语句块结束变量被销毁
读取变量的优先级。**函数内变量 > 全局变量 > 内建变量**
## 示例一
main函数调用foo函数的x变量。 ==> 非法操作
```go
func foo() {
x := 10
fmt.Printf("x: %v\n", x)
}
func main() {
fmt.Printf("x: %v\n", x) // 找不到该变量
}
// 运行结果:
// # command-line-arguments
// code.jiaxzeng.com/backend/study/5.function/variableScope.go:15:24: undefined: x
```
## 示例二
main函数本身没有 x 变量,则读取全局变量x。
foo函数内部定义有 x 变量。则优先读取函数内部的变量x
```go
var (
x = 100
)
func foo() {
x := 10 // 定义并赋值变量
fmt.Printf("foo.x: %v, pointer: %p\n", x, &x)
}
func main() {
foo()
fmt.Printf("main.x: %v, pointer: %p\n", x, &x)
}
// 运行结果:
// foo.x pointer is: 0x50a208
// main.x: 10, pointer: 0x50a208
```
## 示例三
foo 函数没有定义 x 变量,那么读取就是全局变量。函数内部对 x 变量做修改,即是对全局变量 x 做修改。
```go
var (
x = 100
)
func foo() {
fmt.Printf("foo.x pointer is: %p\n", &x)
x = 10 // 赋值变量
}
func main() {
foo()
fmt.Printf("main.x: %v, pointer: %p\n", x, &x)
}
// 运行结果:
// foo.x: 10, pointer: 0x50a208
// main.x: 10, pointer: 0x50a208
```
- Golang简介
- 开发环境
- Golang安装
- 编辑器及快捷键
- vscode插件
- 第一个程序
- 基础数据类型
- 变量及匿名变量
- 常量与iota
- 整型与浮点型
- 复数与布尔值
- 字符串
- 运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 流程控制语句
- 获取用户输入
- if分支语句
- for循环语句
- switch语句
- break_continue_goto语法
- 高阶数据类型
- pointer指针
- array数组
- slice切片
- slice切片扩展
- map映射
- 函数
- 函数定义和调用
- 函数参数
- 函数返回值
- 作用域
- 函数形参传递
- 匿名函数
- 高阶函数
- 闭包
- defer语句
- 内置函数
- fmt
- strconv
- strings
- time
- os
- io
- 文件操作
- 编码
- 字符与字节
- 字符串
- 读写文件
- 结构体
- 类型别名和自定义类型
- 结构体声明
- 结构体实例化
- 模拟构造函数
- 方法接收器
- 匿名字段
- 嵌套与继承
- 序列化
- 接口
- 接口类型
- 值接收者和指针接收者
- 类型与接口对应关系
- 空接口
- 接口值
- 类型断言
- 并发编程
- 基本概念
- goroutine
- channel
- select
- 并发安全
- 练习题
- 第三方库
- Survey
- cobra