Go 语言核心 36 讲
郝林
《Go 并发编程实战》作者,前轻松筹大数据负责人
79610 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
Go 语言核心 36 讲
15
15
1.0x
00:00/00:00
登录|注册

05 | 程序实体的那些事儿(中)

严格类型检查的必要性
字典类型
切片类型
可重名变量的类型
变量重声明的限制
特殊情况:代码包导入语句
变量引用的查找过程
变量重名的编译规则
限制
访问权限
解释试验结果
变量重名的处理
导入代码包的方式
例子:不同类型的可重名变量
变量重声明与可重名变量的区别
问题解析
运行结果
编译结果
示例代码
高内聚,低耦合
控制访问权限
作用域
嵌套关系
含义
思考题
知识扩展
问题:变量与外层代码块中的变量重名的状况
作用域的魅力
代码块
程序实体的那些事儿

该思维导图由 AI 生成,仅供参考

在前文中,我解释过代码块的含义。Go 语言的代码块是一层套一层的,就像大圆套小圆。
一个代码块可以有若干个子代码块;但对于每个代码块,最多只会有一个直接包含它的代码块(后者可以简称为前者的外层代码块)。
这种代码块的划分,也间接地决定了程序实体的作用域。我们今天就来看看它们之间的关系。
我先说说作用域是什么?大家都知道,一个程序实体被创造出来,是为了让别的代码引用的。那么,哪里的代码可以引用它呢,这就涉及了它的作用域。
我在前面说过,程序实体的访问权限有三种:包级私有的、模块级私有的和公开的。这其实就是 Go 语言在语言层面,依据代码块对程序实体作用域进行的定义。
包级私有和模块级私有访问权限对应的都是代码包代码块,公开的访问权限对应的是全域代码块。然而,这个颗粒度是比较粗的,我们往往需要利用代码块再细化程序实体的作用域。
比如,我在一个函数中声明了一个变量,那么在通常情况下,这个变量是无法被这个函数以外的代码引用的。这里的函数就是一个代码块,而变量的作用域被限制在了该代码块中。当然了,还有例外的情况,这部分内容,我留到讲函数的时候再说。
总之,请记住,一个程序实体的作用域总是会被限制在某个代码块中,而这个作用域最大的用处,就是对程序实体的访问权限的控制。对“高内聚,低耦合”这种程序设计思想的实践,恰恰可以从这里开始。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Go语言中代码块和作用域的关系,以及变量的访问控制。通过对代码块的嵌套和作用域的定义,程序实体的访问权限被限制在特定的代码块中。文章通过分析代码示例,清晰地解释了代码块和作用域的概念,以及变量引用的查找过程。此外,文章还强调了变量重声明与可重名变量之间的区别,特别是可重名变量可以拥有不同的类型,因此在使用之前需要进行类型检查。总的来说,本文通过深入浅出的方式帮助读者更好地理解和应用Go语言中的代码块和作用域,以及变量引用的相关规则。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(65)

  • 最新
  • 精选
  • lik0914
    置顶
    模块级私有,怎么全是模块级别呢
    2018-08-22
    2
  • xiaolonghuster
    置顶
    对于和重名变量,不同类型时,可在使用之前通过查看变量类型来确定使用的是哪个地方定义的变量,reflect.TypeOf(container)
    2018-08-22
    7
  • @hl
    置顶
    什么是全域代码块

    作者回复: 一个Go程序可以访问到的所有代码共同组成的代码块,也可以理解为Go标准库和所有工作区中的代码共同组成的代码块。

    2018-08-22
    9
  • javaadu
    置顶
    变量重复声明和变量重名不是一个事情,上篇讲的是前者,这一篇讲后者。变量重名按照作用域进行屏蔽,查找过程从小作用域查到大作用域

    作者回复: 很对。

    2018-08-22
    11
  • 衡子
    置顶
    内容很不错👍 文字能再精简些就更好了!
    2018-08-22
    19
  • 衡子
    置顶
    希望文字能再精简些,很绕!看起来比较费劲!当然内容还是不错的!
    2018-08-22
    23
    332
  • êwěn
    置顶
    如果都是全局的变量,会报重复声明,如果只是在函数体重新声明,作用域不一样,应该不会报错吧

    作者回复: 对,作用域不一样,会出现屏蔽现象。

    2018-08-22
    5
    45
  • atompi
    置顶
    从此地铁上那半小时变得格外充实👍
    2018-08-22
    31
  • 云学
    置顶
    这种变量命名算是code smell么?

    作者回复: 可重名变量如果没用对地方就算

    2018-08-22
    3
  • 小小笑儿
    置顶
    报错,重定义
    2018-08-22
收起评论
显示
设置
留言
65
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部