Go从入门到精通——变量、函数等标识符声明的作用范围

变量、函数等标识符声明的作用范围

  在代码中声明的常量、变量、自定义数据类型、函数等标识符都有一定的作用范围,也就是说这些标识符只能在一定范围内使用,超出范围后使用会出现错误。

  上述代码中,我们本希望最后一条 fmt.Printf("b=%v ",b) 语句输出 b 的值为15,但实际上这段代码编译时候会报错。

  这是因为变量 b 是在条件判断语句的嵌套代码中定义的,因此它的有效范围也从变量声明开始到代码块结束为止。在该代码块之后不可以使用该变量。

  常量、变量、类型、函数名、自定义数据结构类型名等标识符的有效范围都可以简单地归纳如下:

  • 标识符有效范围的起始点在其声明之后,也就是 "先声明再使用";因此,下面的代码是错误的,因为在变量声明之前使用了变量

a = 1

var a int

  • 标识符有效范围的结束点在其声明后最近的代码块末尾,即到最近的右花括号为止。
  • 同一级别的代码块内不可以重复定义一个标识符。
var a int
a := 1

  上面的代码会导致编译错误,因为 a:=1 也是声明变量的另一种方式,相同于在同一个代码块里声明了两次,这是不允许的。

  • 标识符后如果有新开始的嵌套代码块(或者可以说是低一级的代码块),则该标识符在该代码块中仍然有效;但如果该代码块中再次声明了该标识符,则会被视为一个新的标识符,并替代原标识符,但仅限于在这个代码块内有效。

 

  为何 3 次输出变量 b 的值会不尽相同呢?

  因为在主函数 main 中声明变量 b 之后,第一次输出变量 b 的值是在其后的第一个判断条件嵌套代码中,此时变量 b 在此范围内是有效的,因此运算得到的 b 的值是15,第二次输出变量 b 是在第二个条件判断嵌套代码中,但这次在输出之前用 短声明新声明了一个同名变量 b,因此此时该嵌套代码块中输出的 b 与之前 main 函数声明的变量 b 已经不同同一个变量了,所以输出了新变量的值 30,第三次输出时,因为已经出了第二个嵌套代码块,此时,新定义变量b已经失效,而旧的变量b仍然有效,所以在此输出了15这个值。

  • 如果标识符不在任何代码块内(成对的花括号内),则从声明开始一直有效。
package main

import (
"fmt"
)

const pi = 3.14

func perimeter(r float64) float64 {
return 2 * pi * r
}

func main() {
r1 := 13.8
fmt.Printf("圆的周长=%v, 面积=%v ", perimeter(r1), pir1r1)
}

  • 如果定义的全局范围的标识符不是以大写字母开头的,则最多只在代码所在的本地包内有效,如果是以大写字母开头的,则可以被其他包访问,称作 "被导出的" 标识符。

  需要注意的是,全局变量在定义的时候,不能使用短声明的方式(即用 ":=" 声明并赋值的方式),只能用 var 关键字来声明。

原文地址:https://www.cnblogs.com/zuoyang/p/15219176.html