初学者需要注意的问题-变量的作用域

go语言支持多变量同时赋值或者初始化,这是一个很方便的特性。它也允许使用:=操作符同时声明部分新变量,并且给已有变量赋值,这会带来一些需要注意的问题,一不小心就产生bug。 看一段代码:

package main

import "fmt"

func main(){

a, b := 1, 2

b, c := 3, 4

fmt.Println(a, b, c)
}

这里“b, c:= 3, 4”语句是给已有变量b赋值,同时把一个新变量c初始化为4,因此程序的输出结果是: 1 3 4 但是如果这行语句是在另外一个代码块里,效果就不一样了。

package main
import "fmt"
func main(){


a, b := 1, 2


if true {



b, c := 3, 4



fmt.Println(b, c)


}

fmt.Println(a, b)

}

这个程序输出的结果是: 3 4 1 2 说明"b, c := 3, 4"语句是初始化了两个新的变量,其中b和外部变量b重名。 所以结论是: 在同一个函数另外一个代码块,使用:=初始化多个变量时,外部同名变量被自动屏蔽。 这个问题还是挺容易遇到的,新手可能不知道,而老手也可能会不留神给忽略了,结果产生bug。如果能有编译警告就好一些,但是还不清楚有没有这样的编译选项。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-08-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏信安之路

Python 2.7 正则中篇

如上面元字符对照表里的所有字符在正则中表现是一个范围而不能作为字符匹配,例如[0-9]之中的-用来表示0到9的一个范围,而不能匹配横线字符。

11300
来自专栏Crossin的编程教室

【Python 第37课】 字典

今天介绍一个python中的基本类型--字典(dictionary)。 字典这种数据结构有点像我们平常用的通讯录,有一个名字和这个名字对应的信息。在字典中,名字...

368110
来自专栏python3

python3--变量,布尔值,用户交互 input,if语句,while循环

已经运行了第一个python程序,即:终端---->cmd----->python 文件路劲。回车搞定~

26920
来自专栏青玉伏案

算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

本篇博客中的代码实现依然采用Swift3.0来实现。在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找、折半查找、插值查找、Fibon...

19470
来自专栏别先生

Javascript提升阶段学习

JavaScript 1:javascript简介   JavaScript是一种脚本语言,能实现网页内容的交互显示,当用户在客户端显示该网页时,浏览器就会执...

22580
来自专栏互联网杂技

JS中Null与Undefined的区别

Undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined。 Null类型也只有一个值,即null。n...

33340
来自专栏我的博客

init,__construct区别以及PHP魔术方法大汇总

init()是框架设置为初始化函数,当然框架内部还是用的___construct()内置函数;如果你是框架开发者,你当然也可以把初始化函数写成__init(),...

34550
来自专栏云霄雨霁

追踪收集解决方法

18000
来自专栏前端儿

ES6笔记(7)-- Promise异步编程

Promise是一种异步编程的解决方案,本质来说其实它是一种规范,Promises/A+规范

12910
来自专栏Golang语言社区

Golang 基本语法学习笔记之流程控制

条件判断 //实例 func fn01(x int) int { var a int if a = 4; x == 0 {...

276120

扫码关注云+社区

领取腾讯云代金券