《Go 语言第一课》课程学习笔记(七)
代码块与作用域:如何保证变量不会被遮蔽?
- 什么是变量遮蔽呢?
package mainimport ("fmt""github.com/google/uuid""github.com/sirupsen/logrus" )func main() {fmt.Println("hello, world")logrus.Println(uuid.NewString())var (a int = 10b int8 = 6s string = "hello"c rune = 'A't bool = true)var res int = a * int(b)fmt.Println(res)fmt.Println(s)var res2 rune = rune(res) / cfmt.Println(res2)fmt.Println(t)var a1 = 11fmt.Println("a1 =", a1)foo(5)fmt.Println("after calling foo, a1 =", a1) }func foo(n int) {a1 := 1a1 += n } - 输出如下:
hello, world time="2023-08-17T16:04:43+08:00" level=info msg=712d41da-1efa-42eb-91f0-5a3ee017cc0e 60 hello 0 true a1 = 11 after calling foo, a1 = 11- 在这段代码中,函数 foo 调用前后,包级变量 a1 的值都没有发生变化。这是因为,虽然 foo 函数中也使用了变量 a1,但是 foo 函数中的变量 a1 遮蔽了外面的包级变量 a1,这使得包级变量 a1 没有参与到 foo 函数的逻辑中,所以就没有发生变化了。
- 变量遮蔽是 Go 开发人员在日常开发工作中最容易犯的编码错误之一,它低级又不容易查找,常常会让你陷入漫长的调试过程。
代码块与作用域
- Go 语言中的代码块是包裹在一对大括号内部的声明和语句序列,如果一对大括号内部没有任何声明或其他语句,我们就把它叫做空代码块。Go 代码块支持嵌套,我们可以在一个代码块中嵌入多个层次的代码块。
- 每个标识符都有自己的作用域,而一个标识符的作用域就是指这个标识符在被声明后可以被有效使用的源码区域。
- 声明于外层代码块中的标识符,其作用域包括所有内层代码块。
- 包顶层声明中的常量、类型、变量或函数(不包括方法)对应的标识符的作用域是包代码块。
- 当一个包 A 导入另外一个包 B 后,包 A 仅可以使用被导入包包 B 中的导出标识符(Exported Identifier)。
- 在函数 / 方法体中,标识符作用域划分原则更为简单,因为我们可以凭借肉眼可见的、配对的大括号来明确界定一个标识符的作用域范围。
- 函数内部声明的常量或变量对应的标识符的作用域范围开始于常量或变量声明语句的末尾,并终止于其最内部的那个包含块的末尾。
避免变量遮蔽
- Go 官方提供了 go vet 工具可以用于对 Go 源码做一系列静态检查,在 Go 1.14 版以前默认支持变量遮蔽检查,Go 1.14 版之后,变量遮蔽检查的插件就需要我们单独安装了:
go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow@latest。- 一旦安装成功,我们就可以通过 go vet 扫描代码并检查这里面有没有变量遮蔽的问题了。
- 执行检查的命令如下:
go vet -vettool=$(which shadow) -strict xxx.go。 - 工具确实可以辅助检测,但也不是万能的,不能穷尽找出代码中的所有问题,所以还是要深入理解代码块与作用域的概念,尽可能在日常编码时就主动规避掉所有遮蔽问题。
相关文章:
《Go 语言第一课》课程学习笔记(七)
代码块与作用域:如何保证变量不会被遮蔽? 什么是变量遮蔽呢?package mainimport ("fmt""github.com/google/uuid""github.com/sirupsen/logrus" )func main() {fmt.Println("hello, world")logrus.…...
Docker Nginx 运行前端项目
运行Nginx容器: docker run -itd --name nginx -p 80:80 nginx:latest--name是容器名称变量,nginx是创建容器的名称 copy 打包后的前端项目到容器的/usr/share/nginx目录下,拷贝后的目录一定要是:/usr/share/nginx/html否则无法运…...
企业权限管理(十)-用户详情
用户详情 UserController findById方法 Controller RequestMapping("/user") public class UserController {Autowiredprivate IUserService userService;//查询指定id的用户RequestMapping("/findById.do")public ModelAndView findById(String id) thro…...
Windows 11 家庭中文版找不到组策略文件gpedit.msc
最近因为调整日期问题需要用到组策略文件gpedit.msc,但是发现找不到文件 在按键盘 winR 打开运行界面输入 gpedit.msc 回车 Windows找不到文件’gpedit.msc’。请确定文件名是否正确后,再试-次。 检查电脑Windows系统版本 是 Windows 11 家庭中文版 果断早网上搜…...
vue3项目中structuredClone报错
报错:Failed to execute structuredClone on Window: #<Object> could not be cloned 代码: const formData ref({"content": "", // string"id": "", // string"title": "", // …...
Android漏洞之战——整体加壳原理和脱壳技巧详解
一、前言 为了帮助更加方便的进行漏洞挖掘工作,前面我们通过了几篇文章详解的给大家介绍了动态调试技术、过反调试技术、Hook技术、过反Hook技术、抓包技术等,掌握了这些可以很方便的开展App漏洞挖掘工作,而最后我们还需要掌握一定的脱壳技巧…...
网络
mcq Java 传输层:拆分和组装,完成端到端的消息传递,流量控制,差错控制等 网络层: 寻址、路由,复用,拥塞控制,完成源到宿的传递。 显然A选项是错误的,有流量控制的是传输层…...
一直往下get的map
一直往下get的map 文档:一直往下get的map.note 链接:http://note.youdao.com/noteshare?id7b6d315d86ce9e5f8d7cac9be8e924b8&sub95F9FFDA8EB447BBA506286E261F4C88 添加链接描述 package com.example.demo.entity;import org.bson.Document; impo…...
Azure如何调整虚拟机的大小
参考 https://blog.csdn.net/m0_48468018/article/details/132267096 创建虚拟机进入资源,点击大小选项,并对大小进行调整 点击如下图的cloud shell,进入Azure CLI,使用az vm resize 进行大小调整 命令中的g对应资源组,n对应虚拟机名称&am…...
stm32F103R6实现流水灯参考源代码
#include "main.h" #include "gpio.h" void SystemClock_Config(void); void sleep(int a) {int i0,j0;for(i0;i<a;i){for(j0;j<2000;j);}} 真正发挥效果的是这个main函数// int main(void) {int i0;HAL_Init();SystemClock_Config();MX_GPIO_Init()…...
blender 发射体粒子
发射体粒子的基础设置 选择需要添加粒子的物体,点击右侧粒子属性,在属性面板中,点击加号,物体表面会出现很多小点点,点击空格键,粒子会自动运动,像下雨一样; bender 粒子系统分为两…...
你真的掌握了 Python 的七种参数了吗?
不知道为什么网上总有人说 Python 的参数类型有 4 种啊,5 种啊,殊不知其实有 7 种。Python 的 7 种参数分别是 默认参数、位置参数、关键字参数、可变长位置参数、可变长关键字参数、仅位置参数 和 仅关键字参数。小白可能没见过“可变长参数”ÿ…...
人大进仓数据库ksql命令基础
测试环境信息: 系统为银河麒麟V10 数据库为Kingbase ES V8 数据库安装目录为/opt/Kingbase/ES/V8 ksql命令位于/opt/Kingbase/ES/V8/Server/bin下 使用--help获取帮助 续上图 1.查看数据库列表 ./ksql -U system -l 2.查看数据库版本 ./ksql -V 3.连接指定的数据库tes…...
网站上的网页,无法通过百度和bing搜索引擎来搜索
最近搜索某公司网站上的技术资料,百度/bing都不能工作,纳闷 看了下该网站的robots.txt 明白了 User-Agent: * Disallow: / 参考: 网站 robots.txt 文件配置方法,如何禁止搜索引擎收录指定网页内容 - 知乎...
Redis与MySQL的比较:什么情况下使用Redis更合适?什么情况下使用MySQL更合适?
Redis和MySQL是两种不同类型的数据库,各有自己的特点和适用场景。下面是Redis和MySQL的比较以及它们适合使用的情况: Redis适合的场景: 高性能读写:Redis是基于内存的快速Key-Value存储,读写性能非常高。它适用于需要…...
34_windows环境debug Nginx 源码-配置WSL和CLion
文章目录 WSL 中安装 编译构建使用的相关软件重装默认的 ssh创建 libstdc++.so 软链接34_windows环境debug Nginx 源码-配置WSL和CLionWSL 中安装 编译构建使用的相关软件 sudo apt-get update sudo apt-get install libstdc++6 dpkg -L libstdc++6sudo apt-get install libpc…...
单词倒排(C语言详解)
题目:单词倒排 描述:对字符串中的所有单词进行倒排。 说明: 1、构成单词的字符只有26个大写或小写英文字母; 2、非构成单词的字符均视为单词间隔符; 3、要求倒排后的单词间隔符以一个空格表示;如果原字…...
一、数学建模之线性规划篇
1.定义 2.例题 3.使用软件及解题 一、定义 1.线性规划(Linear Programming,简称LP)是一种数学优化技术,线性规划作为运筹学的一个重要分支,专门研究在给定一组线性约束条件下,如何找到一个最优的决策&…...
【推荐】深入浅出学习Spring框架【中】
目录 1.AOP是什么? 2.案列: 3.spring的aop的专业术语 4.代码模拟 4.1 前置通知 3.2.后置通知 3.3.环绕通知 3.4.异常通知 3.5.过滤通知 1.AOP是什么? 面向切面编程(Aspect-Oriented Programming)是一种编程范式,它的主要…...
使用 HTML、CSS 和 JavaScript 创建多步骤表单
使用 HTML、CSS 和 JavaScript 创建多步骤表单 为了处理又长又复杂的表单,我们需要将它们分成多个步骤。通过一次只在屏幕上显示一些输入,表单会感觉更容易理解,并防止用户感到被大量的表单字段淹没。 在本文中,我将逐步指导如何…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...
【大厂机试题解法笔记】矩阵匹配
题目 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...
mcts蒙特卡洛模拟树思想
您这个观察非常敏锐,而且在很大程度上是正确的!您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些,您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”,这个观察非…...
