05 | 程序实体的那些事儿(中)
郝林
该思维导图由 AI 生成,仅供参考
在前文中,我解释过代码块的含义。Go 语言的代码块是一层套一层的,就像大圆套小圆。
一个代码块可以有若干个子代码块;但对于每个代码块,最多只会有一个直接包含它的代码块(后者可以简称为前者的外层代码块)。
这种代码块的划分,也间接地决定了程序实体的作用域。我们今天就来看看它们之间的关系。
我先说说作用域是什么?大家都知道,一个程序实体被创造出来,是为了让别的代码引用的。那么,哪里的代码可以引用它呢,这就涉及了它的作用域。
我在前面说过,程序实体的访问权限有三种:包级私有的、模块级私有的和公开的。这其实就是 Go 语言在语言层面,依据代码块对程序实体作用域进行的定义。
包级私有和模块级私有访问权限对应的都是代码包代码块,公开的访问权限对应的是全域代码块。然而,这个颗粒度是比较粗的,我们往往需要利用代码块再细化程序实体的作用域。
比如,我在一个函数中声明了一个变量,那么在通常情况下,这个变量是无法被这个函数以外的代码引用的。这里的函数就是一个代码块,而变量的作用域被限制在了该代码块中。当然了,还有例外的情况,这部分内容,我留到讲函数的时候再说。
总之,请记住,一个程序实体的作用域总是会被限制在某个代码块中,而这个作用域最大的用处,就是对程序实体的访问权限的控制。对“高内聚,低耦合”这种程序设计思想的实践,恰恰可以从这里开始。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了Go语言中代码块和作用域的关系,以及变量的访问控制。通过对代码块的嵌套和作用域的定义,程序实体的访问权限被限制在特定的代码块中。文章通过分析代码示例,清晰地解释了代码块和作用域的概念,以及变量引用的查找过程。此外,文章还强调了变量重声明与可重名变量之间的区别,特别是可重名变量可以拥有不同的类型,因此在使用之前需要进行类型检查。总的来说,本文通过深入浅出的方式帮助读者更好地理解和应用Go语言中的代码块和作用域,以及变量引用的相关规则。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》,新⼈⾸单¥59
《Go 语言核心 36 讲》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(65)
- 最新
- 精选
- lik0914置顶模块级私有,怎么全是模块级别呢2018-08-222
- xiaolonghuster置顶对于和重名变量,不同类型时,可在使用之前通过查看变量类型来确定使用的是哪个地方定义的变量,reflect.TypeOf(container)2018-08-227
- @hl置顶什么是全域代码块
作者回复: 一个Go程序可以访问到的所有代码共同组成的代码块,也可以理解为Go标准库和所有工作区中的代码共同组成的代码块。
2018-08-229 - javaadu置顶变量重复声明和变量重名不是一个事情,上篇讲的是前者,这一篇讲后者。变量重名按照作用域进行屏蔽,查找过程从小作用域查到大作用域
作者回复: 很对。
2018-08-2211 - 衡子置顶内容很不错👍 文字能再精简些就更好了!2018-08-2219
- 衡子置顶希望文字能再精简些,很绕!看起来比较费劲!当然内容还是不错的!2018-08-2223332
- êwěn置顶如果都是全局的变量,会报重复声明,如果只是在函数体重新声明,作用域不一样,应该不会报错吧
作者回复: 对,作用域不一样,会出现屏蔽现象。
2018-08-22545 - atompi置顶从此地铁上那半小时变得格外充实👍2018-08-2231
- 云学置顶这种变量命名算是code smell么?
作者回复: 可重名变量如果没用对地方就算
2018-08-223 - 小小笑儿置顶报错,重定义2018-08-22
收起评论