本文转载自微信公众号《我的大脑是炸鱼》,作者陈建宇。转载本文请联系脑筋急转弯公众号。大家好,我是炸鱼。一位刚入门Go的读者提出了一个有趣的问题:Go有几种声明变量的方式。作为初学者,你应该使用哪一种,有什么区别,为什么会有多种声明变量的方式?为此,炸鱼就和大家一起探讨这个问题。变量声明在Go中,有两种声明变量的方式,每种方式都有不同的使用场景。它们是:标准变量声明(Variabledeclarations)。短变量声明(Shortvariabledeclarations)标准声明变量声明创建一个或多个变量,将它们绑定到相应的标识符,并赋予每个变量一个类型和一个初始值。使用语法:VarDecl="var"(VarSpec|"("{VarSpec";"}")").VarSpec=IdentifierList(Type["="ExpressionList]|"="ExpressionList)。案例代码:variintvarU,V,Wfloat64vark=0varx,yfloat32=-1,-2var(iintu,v,s=1.0,2.0,"大脑炸了")短声明短变量声明。使用语法:ShortVarDecl=IdentifierList":="ExpressionList.案例代码:s:="炸鱼入脑"i,j:=0,10f:=func()int{return7}ch:=make(chanint)r,w,_:=os.Pipe()_,y,_:=coord(p)网友疑惑。在我们组一个围棋的读者问到这个问题后,我也搜了一下相关资料。我发现有人在stackoverflow上提出了类似的疑惑:问题是:使用哪种声明方式让人迷惑。题目纠结的原因是:如果一个只是另一个的简写,为什么它们的表现会不一样呢?出于什么原因Go的作者允许两种方式来声明一个变量(为什么不将它们合并为一种方式)?只是为了迷惑我们?使用的时候有没有其他需要注意的地方,以免掉坑里?下面结合stackoverflow上这个问题的内容和答案进一步展开,给大家看看里面卖的是什么“药”。”。先想一想:标准声明和短声明,两者有什么区别,还是可以随便用?当代码块的组声明使用包含关键字var的声明语法时,就不同了与其他包不同,Import、const、type、var等关键字声明在可分组的代码块中。例如:var(iintu,v,s=1.0,2.0,"Thebrainisfriedfish")andshortstatements不支持。指定变量的初始值。在使用标准变量定义时,我们只能声明而不能主动定义变量的初始值(默认值为零)。例如:var(iiintsstring)和简短的声明是不可接受的,必须在程序中主动为变量定义一个值。例如:s:="Mybrainisfryingfish"即使这里定义的是一个空字符串,也是用户端定义的而不是默认的零值。局部变量,distinguishingscope在写程序的时候,我们经常会有一些局部变量声明,作用域是有限的。你可以看看你自己的代码。这时候,我们就采取短语句的方式。例如:foridx,value:=rangearray{//Dosomethingwithindexandvalue}ifnum:=runtime.NumCPU();num>1{fmt.Println("MulticoreCPU,cores:",num)}这种简短的语句意义明确场景优势,标准的变量声明在这种场景下并不讨人喜欢。Go语言规范中明确提到变量的重声明。短变量声明可以重新声明变量。这是一个高频的重新声明覆盖操作。如下:varname="friedfish.txt"fi,err:=os.Stat(name)iferr!=nil{log.Fatal(err)}data,err:=ioutil.ReadFile(name)iferr!=nil{log.Fatal(err)}...上面代码中重复定义了err变量。现在如果err!=nil横行,这里短变量的优势简直就是大杀器。综上所述,相信很多朋友在刚开始的时候都纠结于此,或者很多教程根本就没有弄清楚这两种变量声明的区别。在今天的文章中,我们介绍了Go中的两种类型的变量声明。它还解释了存在短语句的场景。主要是:代码块的分组声明。指定变量的初始值。局部变量,独立作用域。重新声明变量。你认为变量声明还有其他优点和缺点吗?欢迎在评论区交流:)参考GoLang变量声明为什么Go中有两种声明变量的方式,有什么区别,分别使用哪一种?在go(golang)中声明变量时的最佳实践是什么?例如。我应该使用“varxint=1”还是只使用“x:=1”?
