Go的变量作用域

Posted demon_gdy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go的变量作用域相关的知识,希望对你有一定的参考价值。

Go 语言变量作用域

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

Go 语言中变量可以在三个地方声明:

  1. 函数内部定义的变量称为局部变量
  2. 函数外部定义的变量称为全局变量
  3. 函数定义中传的变量称为形式参数

 

局部变量

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

栗子~

 

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 func plus() int{
 8     //声明并初始化局部变量num1,num2
 9     num1 := 10
10     num2 := 20
11     sum := num1 + num2
12     //和作为返回值返回
13     return sum
14 }
15 
16 func main(){
17     //调用plus函数并输出返回的结果
18     fmt.Println(plus())
19     /*这个执行会报错undefined: num1,因为这个num1的作用域在plus函数内,所以main函数是无法调用的
20     fmt.Println(num1)
21     */
22 }

 

 

全局变量

在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用。

全局变量可以在任何函数中使用,以下实例演示了如何使用全局变量:

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 var (
 8     //定义全局变量num1,numu2
 9     num1 int = 10
10     num2 int = 20
11 )
12 func plus() int {
13     fmt.Println("plus函数内部调用num1:", num1)
14     fmt.Println("plus函数内部调用num2:", num2)
15     sum := num1 + num2
16     //和作为返回值返回
17     return sum
18 }
19 
20 func main(){
21     fmt.Println("plus函数返回的结果为:",plus())
22     fmt.Println("------------------------")
23     fmt.Println("main函数中调用num1:",num1)
24     fmt.Println("main函数中调用num2:",num2)
25 }

以上代码输出的返回结果为:

plus函数内部调用num1: 10
plus函数内部调用num2: 20
plus函数返回的结果为: 30
------------------------
main函数中调用num1: 10
main函数中调用num2: 20

 

Go 语言程序中全局变量与局部变量名称可以相同,但是函数内的局部变量会被优先考虑。实例如下:

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 var (
 8     //定义全局变量num1,numu2
 9     num1 int = 10
10     num2 int = 20
11 )
12 func plus() int {
13     //内部的局部变量num1作用域要高于外部的num1.计算的时候会使用局部变量计算
14     num1 := 50
15     fmt.Println("plus函数内部调用num1:", num1)
16     fmt.Println("plus函数内部调用num2:", num2)
17     sum := num1 + num2
18     //和作为返回值返回
19     return sum
20 }
21 
22 func main(){
23     fmt.Println("plus函数返回的结果为:",plus())
24     fmt.Println("------------------------")
25     fmt.Println("main函数中调用num1:",num1)
26     fmt.Println("main函数中调用num2:",num2)
27 }

以上代码输出的返回结果为:

plus函数内部调用num1: 50
plus函数内部调用num2: 20
plus函数返回的结果为: 70
------------------------
main函数中调用num1: 10
main函数中调用num2: 20

 

形式参数

形式参数会作为函数的局部变量来使用。实例如下:

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 //声明全局变量a
 8 var a int = 20
 9 
10 func main(){
11     //局部变量
12     var a int = 10
13     var b int = 20
14     var c int =  0
15 
16     fmt.Println("main函数中的a值:", a)
17     c = plus(a, b)
18     fmt.Println("main函数中的c值:", c)
19 
20 }
21 
22 func plus(a, b int) int {
23     //形参a,b的值来自于main函数中的局部变量的a,b两个赋值
24     fmt.Println("plus函数内部的a值:", a)
25     fmt.Println("plus函数内部的b值:", b)
26     return a + b
27 }

以上代码输出的返回结果为:

main函数中的a值: 10
plus函数内部的a值: 10
plus函数内部的b值: 20
main函数中的c值: 30

 

以上是关于Go的变量作用域的主要内容,如果未能解决你的问题,请参考以下文章

[日常] Go语言圣经--作用域,基础数据类型,整型

Go作用域

Go中变量的作用域

Go变量作用域

Go语言变量作用域

JS作用域作用域链