我们知道,golang中局部变量初始化方法(使用“:=”创建并赋值),让我们在使用变量时很方便。但是,这也是易犯错误的地方之一。特别是这个初始化符还支持多个变量同时初始化,更特别的是它还支持原有变量赋值和新变量创建并赋值同时进行!也就是说如果有部分变量不存在的而另外一些是已声明好的,用:=来初始化部分变量同样有效。这其实也没什么,更方便了嘛。但是,go的好多语句还支持局部前置语句,比如在if,for,switch等语句的初始化条件语句中。在这些地方,当你以为使用了原有变量的时候,实际上go已经为你创建了一个局限于这些语句作用范围的新变量!

文字功力太低,说了半天你可能更糊涂了,还是直接用代码说明吧。

//这段代码,一开始声明了code,然后用Atoi解析,此时err没有声明,所以使用了局部变量创建赋值“:=”//下面的写法正确,code还是已存在的那个变量,正确解析后已经变为5func  test(){var code intscode:="5"code,err:=strconv.Atoi(scode);if err!=nil{return err;}return code;
}

//如果,将上面的函数改为下面的样子,结果就不对了,因为在if的后面的初始化语句中使用:=实际上告诉go创建新的在if语句作用域下的局部变量!//此时,code和err都是新的变量,因此,解析后语句外部的code不受影响,结果错误!func test(){    var code int    scode:="5" if code,err:=strconv.Atoi(scode);  err!=nil{ return err;  }return code; }

下面,用一段完整的代码演示一下。

package mainimport "fmt"
import "strconv"func main() {fmt.Println("======conv func 1:")conv1()fmt.Println("======conv func 2:")conv2()
}
func conv1(){code:=10scode:="5"code,err :=strconv.Atoi(scode);if err!=nil{fmt.Println("convert error",err," code=",code);}fmt.Println("after conv ,code=",code);
}
func conv2(){code:=10scode:="5"if code,err :=strconv.Atoi(scode);err!=nil{fmt.Println("convert error",err," code=",code);}fmt.Println("after conv ,code=",code);
}

代码的执行结果:

======conv func 1:
after conv ,code= 5
======conv func 2:
after conv ,code= 10Program exited.

转载于:https://www.cnblogs.com/dajianshi/p/4211848.html

[golang 易犯错误] golang 局部变量初始化:=的陷阱相关推荐

  1. Python初学者易犯错误集合

    Python初学者易犯错误集锦 注释与数据类型使用 分支判断/循环语句 函数定义与使用 模块导入与使用 类与对象 异常处理 与C/C++.Java等编译型语言相比,Python语言显得更简洁优雅,敲起 ...

  2. 遍历ArrayList易犯错误

    场景: 将ArrayList中符合条件的记录删掉,第一时间写出的程序如下: foreach (string aStr in  aList)             {                  ...

  3. OSDev——初学者易犯错误

    原文链接:https://wiki.osdev.org/Beginner_Mistakes 主页:https://blog.csdn.net/qq_37422196/article/details/1 ...

  4. java代码书写易犯错误

    java代码书写易犯错误: 常见报错: 控制台报错: 找不到或无法加载主类 HelloWorld 原因: java.lang.NoClassDefFoundError: cn/itcast/day01 ...

  5. 研发各阶段易犯错误小结

    题记:以下是研发各阶段易出问题的小结,越小细节,越容易犯错误.需要多注意! 一.需求方面 1.需求文档 真正领会客户需求,形成指导开发人员的需求文档或者需求规格说明书是非常难的一件事情. 2.需求文档 ...

  6. 系统管理员易犯错误及解决方法汇总

    原文出自:http://os.51cto.com/art/201101/241510.htm 本文分享的都是系统管理员在工作的时候容易犯的错误,经抚琴煮酒整理并提供解决方法,希望可以给大家一些指导,避 ...

  7. SOPC第二课 新手易犯错误和小灯闪烁SOPC代码以及固化讲解

    QSYS复位端连接错误 如上图所示,由于我们的reset是外边按键给的,我说我们需要导出来,但是如果我们点选了,就不会导出了,一旦点选,复位信号由我们的nios系统给. nios是否破解 由于我们的n ...

  8. python运行代码不成功_python的运行时易犯错误,你中招了没?快来学习了

    小编话不多说,上干货!!欢迎分享跟多python知识,转发++关注,帮助跟多学习的程序猿!!! 1)忘记在 if , elif, else, for, while, class,def声明末尾添加 : ...

  9. Quartus II ( 18.1)使用时易犯错误(个人经验)

    上FPGA实验课时,需要用到Quartus II软件,犯了不少错误,主要是仿真时出错误,这里和大家分享下: 错误1: 这是由于仿真前,没有设置好仿真器的位置导致的:在 Tools->Option ...

  10. eclipse新手易犯错误, eclipse快捷键失效错误;

    太低级的错误了,对于eclipse开发人员来说,但对于新手确实很愁啊: 刚接触eclipse,打开一个项目后,查找方法实现等一些快捷键都失效了:连ctrl + s 都不管用了:网上查找可能是输入法修改 ...

最新文章

  1. 汇编语言 乘法和除法指令
  2. Django框架----分页器(paginator)
  3. python 插入排序算法
  4. 推荐一些动作识别数据集
  5. 利用WebService实现远程服务器文件的上传和下载
  6. 打印图片预览时图片显示不出来_办公小技巧:深入挖掘实用的Excel打印秘诀
  7. Linux网络编程服务器模型选择之并发服务器(上)
  8. linux编译器项目,编译器架构 LLVM
  9. 【Vue】—计算属性缓存VS方法以及侦听器的区别
  10. python迭代器学习与简单的实践
  11. 计算机北桥芯片结构图,电脑主板芯片维修教程第一节:电脑主板你是否真的认识...
  12. 开源生产排程aps(Advanced Planning and Scheduling)软件介绍
  13. 搜狗站长平台的域名验证-搜狗批量添加域名
  14. bootstrap第三章:基本的BootstrapCSS
  15. 搭建GTK+开发环境
  16. 类的加载、连接和初始化
  17. 霸榜COCO!DINO: 让目标检测拥抱Transformer
  18. meta标签详解(name、http-equiv、scheme、charset、各浏览器常用meta标签、常见移动端meta标签)、viewport详解
  19. Android studio3.2 分配内存设置方法
  20. 为了防止火灾发生,安科瑞余压监控系统在某高层住宅的应用方案

热门文章

  1. graphpad做饼图_超省钱的早餐攻略!这些边角料可别扔,多做一步变大餐!
  2. Android TextView 文字居中
  3. 透過 OpenNI / NITE 分析人體骨架(下)
  4. hadoop相关问题-stop-all.sh
  5. cenOS 安装opencv(for matlab)
  6. Nodejs自带模块querystring的使用简介
  7. 凸优化学习笔记(四):对偶性、KKT 条件、敏感性分析
  8. Codeforces Round #574 (Div. 2)
  9. linux6的关机快捷键是,LINUX关机快捷键是什么?
  10. [POJ2796]Feel Good