作用域访问权限:

程序实体访问权限(作用域)有三种:
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 作用域访问权限和变量重声明的更多相关文章

  1. [Golang学习笔记] 04 程序实体1 变量声明

    变量声明: Go语言的程序实体包含:变量.常量.函数.结构体和接口,是一门静态类型的编程语言. (在声明变量或常量的时候,需要指定类型,或者给予足够信息是的Go语言能够推导出类型) Go语言变量的类型 ...

  2. [Golang学习笔记] 06 程序实体3 类型断言和类型转换

    类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...

  3. golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题

    golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...

  4. golang学习笔记8 beego参数配置 打包linux命令

    golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...

  5. go语言,golang学习笔记4 用beego跑一个web应用

    go语言,golang学习笔记4 用beego跑一个web应用 首页 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/ 更新的命令是加个 -u 参数,g ...

  6. go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE

    go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE Go语言是谷歌2009发布的专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速 ...

  7. [Golang学习笔记] 07 数组和切片

    01-06回顾: Go语言开发环境配置, 常用源码文件写法, 程序实体(尤其是变量)及其相关各种概念和编程技巧: 类型推断,变量重声明,可重名变量,类型推断,类型转换,别名类型和潜在类型 数组: 数组 ...

  8. golang学习笔记19 用Golang实现以太坊代币转账

    golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...

  9. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

随机推荐

  1. 排序算法(1) 快速排序 C++实现

    快速排序基本特性 时间复杂度:O(n*lgn) 最坏:O(n^2) 空间复杂度:最好情况下:O(lgn),最坏情况:O(n),平均情况:O(lgn) 不稳定. 关于快速排序的空间复杂度,谢谢@命运他爹 ...

  2. PreApplicationStartMethod特性说明

    PreApplicationStartMethod主要用于为程序集指定一个方法,在程序集加载时进行一些自定义的初始化处理. 使用方式如下所示,首先在程序集中定义一个公共类型和一个公共静态的方法 然后我 ...

  3. MapReduce Design Patterns(chapter 2(part 1))(二)

    随着每天都有更多的数据加载进系统,数据量变得很庞大.这一章专注于对你的数据顶层的,概括性意见的设计模式,从而使你能扩展思路,但可能对局部数据是不适用的.概括性的分析都是关于对相似数据的分组和执行统计运 ...

  4. December 16th 2016 Week 51st Friday

    My life is a straight line, turning only for you. 我的人生是一条直线,转弯只是为了你. My life is a straight line that ...

  5. python_4程序设计基础

    1注释 2变量和常量 3命名 4表达式 5赋值语句

  6. JSON与对象的序列化与反序列化

    一.利用JavaScriptSerializer 类 System.Web.Script.Serialization空间,位于System.Web.extensions.dll中. JavaScrip ...

  7. c++计算器后续(5)

    自娱自乐: 大概是重新开始玩qt,然后MFC和第四步附加的作业大概不会去玩了.以上. QT相关: 阶段一: 原来作业里举了qt和mfc这两个做界面的东西,网上都说qt容易上手,学了mfc再来看qt简直 ...

  8. 打包工具的核心原理(转自:https://juejin.im/entry/5b223ebd518825748b569bda)

    打包工具就是负责把一些分散的小模块,按照一定的规则整合成一个大模块的工具.与此同时,打包工具也会处理好模块之间的依赖关系,最终这个大模块将可以被运行在合适的平台中. 打包工具会从一个入口文件开始,分析 ...

  9. D3——Axes

    使用d3.svg.axis() 创建一个 axis function: var xAxis = d3.svg.axis(); an axis function is called, it doesn’ ...

  10. JavaScript的DOM_StyleSheet操作内联或链接样式表

    使用 style 属性,仅仅只能获取和设置行内的样式,如果是通过内联<style>或链接<link>提供的样式规则就无可奈何了,使用 getComputedStyle 和cur ...