作用域访问权限:

程序实体访问权限(作用域)有三种:
1. 包级私有(代码包)
2. 模块级私有(代码包)
3. 公开(全域)。

一个函数是一个代码块。
一个程序实体的作用域总是会被限制在某个代码块中。
好处:控制访问权限, 对“高内聚,低耦合”思想的实践。

面试题:如果一个变量与其外层代码块中的变量重名会出现什么状况?

package mainimport "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讲》专栏,如有侵权,请联系我删除。

 

转载于:https://www.cnblogs.com/fyql/p/10202358.html

[Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明相关推荐

  1. golang学习笔记(基础篇)

    LCY~~Golang学习笔记 一.Go语言开发环境 ##安装Go开发包以及VsCode Go开发包与vscode配置安装教程网址:https://www.liwenzhou.com/posts/Go ...

  2. 118云原生编程语言Golang学习笔记

    Golang学习笔记 文章目录 1.Go简介 1.1 简介 1.2 设计初衷 1.3 Golang vs Java 1.4 应用领域 1.5 用go语言的公司 2.Go下载和安装 2.1 开发工具 2 ...

  3. JavaWeb黑马旅游网-学习笔记05【分类数据展示功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  4. JavaWeb-综合案例(用户信息)-学习笔记05【分页查询功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

  5. MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

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

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

  7. Vue学习笔记05 组件的自定义事件-组件通信-$nextTick-脚手架解决ajax跨域-插槽-过渡动画

    文章目录 Vue学习笔记05 父组件给子组件传值 注意点 子组件给父组件传值 父组件接受子组件的传值 通过函数 组件的自定义事件 事件绑定的第一种写法 @或v-on 事件绑定的第二种写法:使用ref ...

  8. [电离层建模学习笔记]开源程序M_GIM学习记录

    [电离层建模学习笔记]开源程序M_GIM学习记录 文章目录 [电离层建模学习笔记]开源程序M_GIM学习记录 1. 程序相关信息 2. 程序学习记录 2.1 采用的数据说明 2.2 程序运行前 2.3 ...

  9. ESP32 单片机学习笔记 - 05 - AP/Smart Config

    ESP32 单片机学习笔记 - 05 - AP/Smart Config 终于把感觉必要的基础外设学完了,开始学esp32的主要特色功能--物联网~~?(大概) 一.WIFI热点 AP模式 编程指南: ...

最新文章

  1. 书评 | 产品的事可以简化为两件,产品团队有两种...
  2. python用os.system打开wav文件_使用python读取wav格式文件
  3. Java获取异常堆栈信息
  4. linux usb组合设备,USB组合设备(5)
  5. Zookeeper基础使用机制原理
  6. OpenCV3学习(12.2) 目标跟踪之运动模板法segmentMotion实现(Mat版本)
  7. Jetty报ArrayIndexOutBoundsException:30305的解决方案
  8. mysql union limit_mysql中的union和order by、limit
  9. CGI-Plus v5.0.0.6 一键系统备份恢复工具箱单文件增强版
  10. 行人跟踪之身份识别(一)
  11. Deqin - 接小球游戏
  12. 《我不是潘金莲》所揭示的
  13. DOM基础详细 包含多个案例
  14. 高等数学(第七版)同济大学 习题5-4 个人解答
  15. 浙大计算机各个实验室 详细介绍(持续更新)
  16. Converter/MultiBinding示例
  17. 第十五届吉林省大学生程序设计竞赛个人题解
  18. 条形码(barcode)code128生成代码
  19. font在html语言中是什么意思,font在html中的意思
  20. Winform知识扩展-------右键菜单与InputBox弹出式输入框

热门文章

  1. hbuilder/hbuilderx 无法检测到模拟器
  2. springboot多数据源动态切换和自定义mybatis分页插件
  3. LeetCode - Minimum Window Substring
  4. C++习题 商品销售(商店销售某一商品,每天公布统一的折扣(discount)。同时允许销售人员在销售时灵活掌握售价(price),在此基础上,一次购10件以上者,还可以享受9.8折优惠。)...
  5. [转]HDR渲染器的实现(基于OpenGL)
  6. 详解C++中经常看到的#include <iostream> using namespace std;
  7. leetcode算法题--飞机座位分配概率
  8. linux c 设置utc时间,C/C++标准库之转换UTC时间到local本地时间详解
  9. 实现数组(java)
  10. 黑暗城堡 最短路径生成树