Go语言中的分配操作符
最近我在玩Google的新编程语言Go
并想知道为什么赋值运算符:=
在等号前面有一个冒号=
为什么这个语言的作者想要使用name := "John"
而不是name = "John"
:=
符号既可以作为声明,也可以作为初始化。
foo := "bar"
相当于
var foo = "bar"
为什么不像任何脚本语言那样只使用foo = "bar"
,你可能会问? 那么,这是为了避免错别字。
foo = "bar" fooo = "baz" + foo + "baz" // Oops, is fooo a new variable or did I mean 'foo' ?
name := "John"
只是语法上的糖而已
var name string name = "John"
Go是静态types的,所以你必须声明variables。
:=
不是赋值运算符。 这是一个简短的variables声明。 =
是赋值运算符。
短variables声明
一个简短的variables声明使用语法:
ShortVarDecl = IdentifierList ":=" ExpressionList .
它是具有初始化expression式的常规variables声明的简写,但是没有types:
"var" IdentifierList = ExpressionList .
分配
Assignment = ExpressionList assign_op ExpressionList .
assign_op = [ add_op | mul_op ] "=" .
在Go中, name := "John"
是var name = "John"
缩写。
Rob Pike 解释了为什么Go在他的演讲“起源的起源”(2010)期间。
:=
是另一种语言的伪操作符,被派克(Pike)称为Newsquek(1989)。 其中有帕斯卡尔符号和能够推断types声明和初始化成语( 第15页 )
// variable: [type] = value x: int = 1 x := 1
边际注意: Robert Griesemer 提出 :=
操作员回答“你从Go拿走什么东西? 在Google I / O 2013的QA会议期间提到这一点。
这两种语言都是Go语言中variables声明的不同方法。
var name = "John" // is a variable declaration
和
name := "John" // is a short variable declaration.
一个简短的variables声明是具有初始化expression式但没有types的正则variables声明的简写。
阅读下面的细节:
variables声明
短variables声明
答案的重要背景:
:=
是初始化variables的简写操作符。 在Go中 ,以下操作是等效的:
var myNumb String = "one" myNumb := "one"
回答:
现在隐含的问题是:“为什么要devise速记符号:=
在=
之前有一个:
?”。 原因是为了防止stream行的拼写错误。 如果简写赋值运算符只是=
,那么可能有以下情况:
var myNumb String = "one" myNumb = "two"
现在,创build该代码的用户是否打算重新分配two
myNumb
,还是他错误地键入myNumbTwo
而不是正确键入myNumbTwo
? 通过将冒号包含在:=
,程序员必须提交两个错误(忘记冒号并忘记该variables)才能产生错误,从而大大降低了这样做的可能性。