最近我正在使用谷歌的新编程语言Go
并且想知道为什么赋值运算符:=
在等号前面有一个冒号=
该语言的作者是否有特殊原因想要使用name := "John"
代替name = "John"
答案 0 :(得分:109)
:=
表示法既可以作为声明也可以作为初始化。
foo := "bar"
相当于
var foo = "bar"
为什么不使用任何脚本语言中的foo = "bar"
,您可能会问?好吧,这是为了避免拼写错误。
foo = "bar"
fooo = "baz" + foo + "baz" // Oops, is fooo a new variable or did I mean 'foo' ?
答案 1 :(得分:32)
name := "John"
只是
的语法糖var name string
name = "John"
Go是静态类型的,因此您必须声明变量。
答案 2 :(得分:18)
:=
不是赋值运算符。这是一个简短的变量声明。 =
是赋值运算符。
短变量声明使用语法:
ShortVarDecl = IdentifierList ":=" ExpressionList .
它是使用初始化程序进行常规变量声明的简写 表达式,但没有类型:
"var" IdentifierList = ExpressionList .
Assignment = ExpressionList assign_op ExpressionList .
assign_op = [ add_op | mul_op ] "=" .
在Go中,name := "John"
是var name = "John"
的缩写。
答案 3 :(得分:10)
Rob Pike explains为什么Go在他的演讲中有:=
" Goins of Go" (2010)。
:=
是Pike编写的另一种语言的伪运算符,叫做Newsquek(1989)。
其中有Pascal-ish表示法和推断类型的能力,用于声明和初始化成语(page 15)
// variable: [type] = value
x: int = 1
x := 1
边缘注释: Robert Griesemer brings up :=
运营商回答问题"你从Go中拿走了什么?"在Google I / O 2013的质量保证会议期间。将其称为方便但有问题的。
答案 4 :(得分:4)
两者都是Go语言中变量声明的不同技术。
var name = "John" // is a variable declaration
AND
name := "John" // is a short variable declaration.
短变量声明是具有初始化表达式但没有类型的常规变量声明的简写。
请阅读以下详细信息:
答案 5 :(得分:2)
答案的重要背景:
:=
是用于初始化变量的简写运算符。在开始中,以下操作是等效的:
var myNumb String = "one"
myNumb := "one"
<强>答案:强>
现在隐含的问题是:“为什么设计速记符号:=
以在:
之前设置=
?”。原因是为了防止普遍存在的错别字。如果简写赋值运算符只是=
,那么您可能会遇到以下情况:
var myNumb String = "one"
myNumb = "two"
创建该代码的用户现在是否打算将two
重新分配给myNumb
,还是错误地键入myNumb
而不是正确键入myNumbTwo
?通过在:=
中包含冒号,程序员必须提交两个错误(忘记冒号并忘记var
)以便有一个错误,从而减少这样做的可能性 强>
答案 6 :(得分:2)
之间至少有一个微妙的区别
name := "John"
和
var name = "John"
前者是非声明语句,不允许在函数体之外,而后者是包级别的有效语句。