Golang 变量作用域陷阱 误用短声明导致变量覆盖

2023-11-15

var remember bool = false
if something {
    remember := true //错误
}
// 使用remember

在此代码段中,remember 变量永远不会在 if 语句外面变成 true,如果 something 为 true,由于使用了短声明 :=,if 语句内部的新变量 remember 将覆盖外面的 remember 变量,并且该变量的值为 true,但是在 if 语句外面,变量 remember 的值变成了 false,所以正确的写法应该是:

if something {
    remember = true
}
	var remember bool = false

	if true {
		remember := true //错误
		fmt.Printf("if %v %p \n", remember, &remember)
	}
	
    fmt.Printf("main %v %p \n", remember, &remember)

if true 0xc0000a608f    
main false 0xc0000a608e 

 此类错误也容易在 for 循环中出现,尤其当函数返回一个具名变量时难于察觉,例如以下的代码段:

func shadow() (err error) {
    x, err := check1() // x是新创建变量,err是被赋值
    if err != nil {
        return // 正确返回err
    }
    if y, err := check2(x); err != nil { // y和if语句中err被创建
        return // if语句中的err覆盖外面的err,所以错误的返回nil!
    } else {
        fmt.Println(y)
    }
    return
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang 变量作用域陷阱 误用短声明导致变量覆盖 的相关文章

  • Go内存管理及性能观测工具

    内存管理 TCMalloc Golang内存分配算法主要源自Google的TCMalloc算法 TCMalloc将内存分成三层最外层Thread Cache 中间层Central Cache 最里层Page Heap Thread Cach
  • go struct{} 空结构体的特点和作用

    空结构体的特点和作用 参考代码 package main import fmt unsafe func main empStruct 空结构体的实例和作用 func empStruct 空结构体的特点 1 不占用内存 2 地址不变 var
  • golang-bufio 缓冲扫描

    前面两篇博客 介绍了 bufio 包中的缓冲读和写 bufio go 下面再来介绍一下缓冲扫描 scan go 这个扫描的是用来对缓存读的更高级封装 提供了一些更易用的方法 缓冲扫描 Scanner 提供了一个方便的接口来读取数据 例如使用
  • 使用Docker registry镜像创建私有仓库

    2015 01 25 wcdj 摘要 安装Docker后 可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境 本文记录简单的搭建过程 1 使用registry启动私有仓库的容器 docker run d p 5000 50
  • 【Golang入门】Golang第一天心得

    生活所迫 入门一下Go 很奇葩的第一点 接口 package main import fmt 定义一个接口 type Shape interface Area float64 定义一个矩形类型 type Rectangle struct W
  • go踩坑——no required module provides package go.mod file not found in current directory or any parent

    背景 准备运行下面代码 package main import github com gin gonic gin func main 创建一个默认的路由引擎 r gin Default GET 请求方式 hello 请求的路径 当客户端以G
  • Go项目部署及所遇问题

    小聊 本次小白给大家带来Golang项目部署操作以及个人所遇问题和解决它们的方法 依然是一边实操演示一边写文稿 如遇相似问题却存有疑惑可留言 开发环境是Window 部署环境是Linux 开发工具为GoLand 部署服务器为阿里云 1 打包
  • Qt webengine 显示web页面、前后端通信以及下载详解

    概述 官方文档 https doc qt io archives qt 5 11 qtwebengine overview html 翻译文档 Qt5 9 WebEngine 概述 一花一世界 一叶一乾坤 博客园 从Qt5 5开始 Qt W
  • beego+goAdmin+mysql+docker+natapp作为微信小程序地服务器“伪部署”

    写在前面的话 1 为什么我要叫伪部署 答 因为我把它们放在服务器运行 都是开发模式 生产模式实在不会弄 所以就这样了 2 系统环境 答 腾讯云服务器 系统为 ubuntu 版本不记得 应该是比较高的 3 前提假设 答 假设你的服务器已经安装
  • goland环境配置

    goland modules环境配置 下载和安装goland 环境配置 配置环境变量GOPATH 配置go modules GOPROXY代理的系统变量 工程目录中新建三个工作目录 goland中启用go modules 新建一个go程序
  • Go 语言输出文本函数详解

    Go语言拥有三个用于输出文本的函数 Print Println Printf Print 函数以其默认格式打印其参数 示例 打印 i 和 j 的值 package main import fmt func main var i j stri
  • 为什么最近听说 Go 岗位很少很难?

    大家好 我是煎鱼 其实这个话题已经躺在我的 TODO 里很久了 近来很多社区的小伙伴都私下来交流 也有在朋友圈看到朋友吐槽 Go 上海的大会没什么人 还不如 Rust 大会 比较尴尬 今天主要是看看为什么 Go 岗位看起来近来很难的样子 也
  • 【go语言开发】编写单元测试

    本文主要介绍使用go语言编写单元测试用例 首先介绍如何编写单元测试 然后介绍基本命令的使用 最后给出demo示例 文章目录 前言 命令 示例 前言 在go语言中编写单元测试时 使用说明 测试文件命名 在 Go 语言中 测试文件的命名应与被测
  • go-zero 开发入门-加法客服端示例

    定义 RPC 接口文件 接口文件 add proto 的内容如下 syntax proto3 package add 当 protoc gen go 版本大于 1 4 0 时需加上 go package 否则编译报错 unable to d
  • go-zero开发入门-API网关开发示例

    开发一个 API 网关 代理 https blog csdn net Aquester article details 134856271 中的 RPC 服务 网关完整源代码 file main go package main import
  • go-zero目录结构和说明

    code of conduct md 行为准则 CONTRIBUTING md 贡献指南 core 框架的核心组件 bloom 布隆过滤器 用于检测一个元素是否在一个集合中 breaker 熔断器 用于防止过多的请求导致系统崩溃 cmdli
  • go-zero开发入门-API服务开发示例

    接口定义 定义 API 接口文件 接口文件 add api 的内容如下 syntax v1 info title API 接口文件示例 desc 演示如何编写 API 接口文件 author 一见 date 2023年12月07日 vers
  • GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

    这章是接上一章 使用 RPC包 序列化中没有详细去讲 因为这一块需要看的和学习的地方很多 并且这一块是RPC中可以说是最重要的一块 也是性能的重要影响因子 今天这篇主要会讲其使用方式 文章目录 Protocol Buffers V3 背景以
  • 协程-单线程内的异步执行

    1 仿协程实例 不同事件依次顺序执行 coding utf 8 import time def calculate 1 step event name for index in range step print This is s even
  • 【go语言】error错误机制及自定义错误返回类型

    简介 Go 语言通过内置的 error 接口来处理错误 该接口定义如下 type error interface Error string 这意味着任何实现了 Error 方法的类型都可以作为错误类型 在 Go 中 通常使用 errors

随机推荐

  • centos解决mysql-bin.000*占用超大空间的问题

    本站 也就是安全者 网站数据库挂了一下午 也没时间处理 晚上回来后尝试restart mysql 发现一直提示shutting down 关闭不了 也stop不了 服务器重启也不行 可以确信肯定是mysql出问题了 进入mysql的data
  • HTTPS的加密过程

    HTTPS HTTPS即加密的HTTP HTTPS并不是一个新协议 而是HTTP SSL TLS 原本HTTP先和TCP 假定传输层是TCP协议 直接通信 而加了SSL后 就变成HTTP先和SSL通信 再由SSL和TCP通信 相当于SSL被
  • 【数据结构与算法——TypeScript】数组、栈、队列、链表

    数据结构与算法 TypeScript 算法 Algorithm 的认识 解决问题的过程中 不仅仅 数据的存储方式会影响效率 算法的优劣也会影响效率 什么是算法 定义 一个有限指令集 每条指令的描述不依赖于言语 编写指令 java c ts
  • (十八)Mybatis的XML文件中不允许出现“>“

    mybatis XML文件中不允许出现 gt lt 之类的符号 需要转义 是可以正常 关于elasticsearch中 gt gte lt lte缩写的含义
  • 反序列化漏洞原理/防御

    序列化就是将对象转换成字节流 可以更方便的将数据保存到本地文件 反序列化就是将字节流还原成对象 Java中提供了两个接口来支持序列化 ObjectIutputStream 和ObjectOutputStream 序列化相对安全 问题出在反序
  • html烟花特效,发射粒子特效,爱心特效,动态祝福、节日祝福网页,时间罗盘,黑客帝国代码雨、文字闪烁、表白爱心网页等等(附下载链接)

    粒子炫酷特效网页 html css js 大家都觉得程序员的工作很枯燥乏味 今天我就带大家看看程序员开发的那些漂亮的网页效果 点我下载源码 1 烟花特效 粒子特效 节日祝福 表白爱心网页 动态泡泡网页 动态蝴蝶网页 七叶草动态飘落网页 时间
  • Linux学习-Linux系统及编程基础笔记

    useradd zhangsan passwd zhangsan visudo往 etc sudoers文件中添加zhangsan visudo 找到如下的行 root ALL ALL ALL 往该行下面添加zhangsan zhangsa
  • 深度学习与机器学习的思考

    需要一些传统图像处理知识为佳 end to end 端到端 说的是 输入的是原始数据 始端 然后输出的直接就是最终目标 末端 中间过程不可知 因此也难以知 就此 有人批评深度学习就是一个黑箱 Black Box 系统 其性能很好 却不知道为
  • PostgreSQL 计算逾期率

    描述 计算下ylhx4 cxh xinyanfeature表 小鲨中部分用新颜的数据 中的1999个用户 首次借款第一期 第二期的d0和d15的逾期率 还款信息在transformdata xsfinrak表 小鲨用户 中 psperdno
  • 中点分割裁剪算法

    中点分割裁剪算法 python 实验目的 采用中点分割方法找到距离线段顶点最近的可见点 找到后 进行绘制 即可实现直线段在裁剪窗口的裁剪显示 算法思想 设要裁剪的线段是P1P2 中点分割算法可分成两个平行的过程进行 即从P1点出发找出离P1
  • Git基础操作:本地分支和远程分支改名

    相信聪明的你 直接看代码就能看懂 本地分支改名 git branch m feature add header2 feature add header 删除远程分支 git push origin feature add header2 本
  • FlashAttention

    一 论文题目 发表处 时间 FlashAttention Fast and Memory Efficient Exact Attention with IO Awareness 二 主要方向 新型注意力机制 三 细化任务 一种具有 IO 感
  • 2022深圳杯C题思路解析

    题目描述 继续更新 再更问题三 继续更新第一问 第四问 1 2 问题重述 在制定电动车调度方案时 必须考虑充 换电池的时间成本 从而提出了新 的车辆运输选址及调度问题 1 已知自动驾驶电动物料车在取料点 P 和卸货点 D 之间往复运送物料
  • Qt 对象树

    作者 billy 版权声明 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 Object Tree Model 先来看一下 QObject 的构造函数 通过帮助文档我们可以看到 QObject 的构造函数中会传入一个 P
  • Linux ./configure --prefix 命令是什么意思?

    Linux configure prefix 命令是什么意思 源码的安装一般由3个步骤组成 配置 configure 编译 make 安装 makeinstall Configure是一个可执行脚本 它有很多选项 在待安装的源码路径下使用命
  • D - Meeting Bahosain Gym - 102263D

    Essa wanted to meet the most powerful number theorist of all time Bahosain but Bahosain does not waste his precious time
  • 凸优化学习(四)——凸优化问题

    注意 本文内容来自于吴恩达老师cs229课堂笔记的中文翻译项目 https github com Kivy CN Stanford CS 229 CN 中的凸优化部分的内容进行翻译学习 4 凸优化问题 利用凸函数和集合的定义 我们现在可以考
  • CSS——快速入门

    CSS的优势 1 内容和表现分离 2 网页结构表现统一 3 样式十分的丰富 4 建议使用独立于HTML的CSS文件 5 利用SEO 容易被搜索引擎收录 style
  • oracle 重复列只显示一次的实现

    CREATE TABLE test ob id VARCHAR 32 ob name VARCHAR 32 INSERT INTO test VALUES A001 A001 a INSERT INTO test VALUES A001 A
  • Golang 变量作用域陷阱 误用短声明导致变量覆盖

    var remember bool false if something remember true 错误 使用remember 在此代码段中 remember 变量永远不会在 if 语句外面变成 true 如果 something 为 t