多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[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 ```