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)才能产生错误,从而大大降低了这样做的可能性。