[Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明
作用域访问权限:
程序实体访问权限(作用域)有三种:
1. 包级私有(代码包)
2. 模块级私有(代码包)
3. 公开(全域)。
一个函数是一个代码块。
一个程序实体的作用域总是会被限制在某个代码块中。
好处:控制访问权限, 对“高内聚,低耦合”思想的实践。
面试题:如果一个变量与其外层代码块中的变量重名会出现什么状况?
package main import "fmt" var block = "package" func main() {
block := "function"
{
block := "inner"
fmt.Printf("The block is %s.\n", block)
}
fmt.Printf("The block is %s.\n", block)
}
上面代码能通过编译。运行后打印内容:
The block is inner.
The block is function.
解析:
对于不同的代码块,变量重名没有什么大不了,照样可以通过编译。
1. 代码引用变量的时候总会最优先查找当前那个变量。“当前代码块”仅仅是引用变量的代码所在的那个代码块,并不包含任何子代码块。
2. 如果当前代码块中没有声明以此为名的变量,程序会沿着代码块的嵌套关系,从直接包含当前代码块的那个代码块开始,一层一层地查找。
查找过程:从小作用域到大作用域
典型回答:
如果变量重名,在全域代码块中声明的变量会被子代码块中的重声明覆盖。
在子代码块中声明的变量,只能在该代码块中生效,使用。
重声明:
Q:不同代码块中的重命名变量与变量重声明中的变量区别在哪儿?
1. 变量重声明的变量一定在某一个代码块内。不包含它的任何子代码块。
2. 变量重声明是对同一个变量的多次声明,变量只有一个。而可重命名变量中涉及的变量肯定是有多个的。
3. 不论对变量重声明多少次,其类型必须始终一致。具体遵从第一次被声明时给定的类型。而可重命名变量无此限制。
4. 可重命名变量在代码块之间,存在直接或间接的嵌套关系,存在“屏蔽”的现象。
思考题:如果通过import . xxx 这种导入代码包中的变量与当前代码包中的变量重名了,那么Go语言是会把他们当做“可重名变量”看待还是会编译报错呢?
A:会报redeclared错误。(变量名大写)
采用import . xxx,会认为引入的代码包的代码,如果在本包中一样,那作用域其实时同一个,不允许重复声明。
本学习笔记是仅为了总结自己学到的Go语言核心知识,方便以后回忆,文中部分内容摘录自极客时间的《Go语言核心36讲》专栏,如有侵权,请联系我删除。
[Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明的更多相关文章
- [Golang学习笔记] 04 程序实体1 变量声明
变量声明: Go语言的程序实体包含:变量.常量.函数.结构体和接口,是一门静态类型的编程语言. (在声明变量或常量的时候,需要指定类型,或者给予足够信息是的Go语言能够推导出类型) Go语言变量的类型 ...
- [Golang学习笔记] 06 程序实体3 类型断言和类型转换
类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...
- golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题
golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...
- golang学习笔记8 beego参数配置 打包linux命令
golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...
- go语言,golang学习笔记4 用beego跑一个web应用
go语言,golang学习笔记4 用beego跑一个web应用 首页 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/ 更新的命令是加个 -u 参数,g ...
- go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE
go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE Go语言是谷歌2009发布的专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速 ...
- [Golang学习笔记] 07 数组和切片
01-06回顾: Go语言开发环境配置, 常用源码文件写法, 程序实体(尤其是变量)及其相关各种概念和编程技巧: 类型推断,变量重声明,可重名变量,类型推断,类型转换,别名类型和潜在类型 数组: 数组 ...
- golang学习笔记19 用Golang实现以太坊代币转账
golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...
- golang学习笔记18 用go语言编写移动端sdk和app开发gomobile
golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...
随机推荐
- 推送代码到GitHub上的两种方式
要想将本地Git上代码提交到GitHub可以使用两种协议进行提交,分别使用HTTPS和SSH两种协议,如下所示. 当使用HTTPS协议时,每次推送的时候都需要输入GitHub平台的用户名密码. ...
- Scala编译器安装
1.安装JDK 因为Scala是运行在JVM平台上的,所以安装Scala之前要安装JDK. 2.安装Scala Windows安装Scala编译器 访问Scala官网http://www.scala- ...
- Eclipse html 编辑器插件下载安装
需要在eclipse里面编辑html和jsp,语法高亮和语法提示,自动补全等. 一.下载GEF(依赖包): 1.下载地址:http://www.eclipse.org/downloads/downlo ...
- BZOJ 1562 变换序列 二分图匹配+字典序
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1562 题目大意: 思路: 逆序匹配,加边匹配的时候保持字典序小的先加入. 具体证明:h ...
- python中基于descriptor的一些概念(上)
@python中基于descriptor的一些概念(上) python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2 ...
- 使用python编写svn钩子
同上一篇trac中安装插件的文章的出发点一样,感觉用文档和口头制定规则在执行上会有偏差并且需要经常引导新人去熟悉规则. 所以,又费了几个小时去琢磨怎么改进svn提交代码的钩子,现有的钩子的功能比较简单 ...
- 在Java中使用Maven配置的版本信息
我们在使用maven开发一些项目的时候需要知道当前的版本状态,但版本状态储存在pom.xml文件中,可以采用以下2种方式进行获取: 1. 采用xml解析的方式去获取pom文件的{project.ver ...
- 404 Note Found 队-Alpha4
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:何家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员:何宇恒 展示组内最新 ...
- LCG(linear congruential generator): 一种简单的随机数生成算法
目录 LCG算法 python 实现 LCG算法 LCG(linear congruential generator)线性同余算法,是一个古老的产生随机数的算法.由以下参数组成: 参数 m a c X ...
- i2c 通信
时间长了记忆就会模糊, 保存下逻辑分析抓到的图像, 什么时候需要可以看一眼. 当clk处于高电平时, data线有下降,说明开始传输, 有上升说明结束传输. 发送地址无回应: 发送地址有回应 正常数据 ...