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