Go 语言编程 — 作用域

只愿长相守 提交于 2020-10-01 02:36:28

目录

作用域

作用域是已声明标识符所表示的常量、类型、变量、函数、或包在源代码中的作用范围(有效性范围)。

注意,声明了的局部变量必须被引用,否则会触发异常。全局变量则不需要,因为编译器会考虑该全局变量是否会在其他地方被引用。

局部变量

在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,形式参数和返回值变量也是局部变量。

package main

import "fmt"

func main() {

   /* 声明局部变量 */
   var a, b, c int

   /* 初始化参数 */
   a = 10
   b = 20
   c = a + b

   fmt.Printf ("结果: a = %d, b = %d and c = %d\n", a, b, c)
}

全局变量

在函数体外声明的变量称之为全局变量,作用域为整个包(Package),可以在包内的任何函数中使用。

需要注意的是,包内有效变量的可导出性由变量名称的首字母大小写决定。

  • 小写:不可导出,外部包无法导入。
  • 大写:可导出,外包可以导入。
package main

import "fmt"

/* 声明全局变量 */
var g int

func main() {

   /* 声明局部变量 */
   var a, b int

   /* 初始化参数 */
   a = 10
   b = 20
   g = a + b

   fmt.Printf("结果: a = %d, b = %d and g = %d\n", a, b, g)
}

注意:当全局变量和局部变量重名时,优先考虑局部变量。

package main

import "fmt"

/* 声明全局变量 */
var g int = 20

func main() {
   /* 声明局部变量 */
   var g int = 10

   fmt.Printf ("结果: g = %d\n",  g)
}

结果:

结果: g = 10

变量的声明周期

  • 变量初始化在何时发生? 包级别全局变量在 main 函数开始前,而局部变量则在函数执行期间(声明时)。
  • 包级别变量的生命周期是? 程序运行期间。
  • 局部级别变量的生命周期是? 一直生存直至垃圾回收。如果处于性能考虑,要减少局部变量逃逸,从而减少 GC。
  • 在一个作用域内,x := x + 1,这里的两个 x 是同一个变量么?不是。
  • 怎么理解 for / if 的作用域?分隐式块和显式块,隐式块包含:声明 + 条件 + 后置语句(for 循环),显式块则为流程代码块。
  • 怎么理解 if / else if / else?单纯的嵌套,与之对应的,也是作用域嵌套。
  • 怎么理解 switch 的作用域?每个条件对应一个块,每个 case 语句体对应一个块。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!