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

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

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

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

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

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

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

a = 1

var a int

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

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

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

 

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

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

  • 如果标识符不在任何代码块内(成对的花括号内),则从声明开始一直有效。
1
2
3
4
5
6
7
8
9
10
11
12
13
package main
<p>import (<br>
"fmt"<br>
)</p>
<p>const pi = 3.14</p>
<p>func perimeter(r float64) float64 {<br>
return 2 * pi * r<br>
}</p>
<p>func main() {<br>
r1 := 13.8<br>
fmt.Printf("圆的周长=%v, 面积=%v\n", perimeter(r1), pi<em>r1</em>r1)<br>
}<br>
</p>

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

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

posted @   左扬  阅读(171)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
levels of contents
点击右上角即可分享
微信分享提示