最近我在玩谷歌的新编程语言Go
并且想知道为什么赋值运算符:=
在等号前面有一个冒号=
是否有特殊原因为什么该语言的作者想要使用name := "John"
而不是name = "John"
该:=
符号既可用作声明,也可用作初始化。
foo := "bar"
相当于
var foo = "bar"
foo = "bar"
您可能会问,为什么不只在任何脚本语言中使用like 呢?嗯,这是为了避免错别字。
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 是静态类型的,所以你必须声明变量。
:=
不是赋值运算符。这是一个简短的变量声明。=
是赋值运算符。
简短的变量声明使用以下语法:
ShortVarDecl = IdentifierList ":=" ExpressionList .
它是带有初始化表达式但没有类型的常规变量声明的简写:
"var" IdentifierList = ExpressionList .
Assignment = ExpressionList assign_op ExpressionList .
assign_op = [ add_op | mul_op ] "=" .
在 Go 中,name := "John"
是var name = "John"
.
两者之间至少存在一个细微差别
name := "John"
和
var name = "John"
前者是非声明语句,不允许在函数体之外,而后者是包级别的有效语句。
答案的重要背景:
:=
是用于初始化变量的速记运算符。在Go中,以下操作是等价的:
var myNumb String = "one"
myNumb := "one"
回答:
现在隐含的问题是:“为什么要设计速记符号在 ?之前:=
有一个?”。原因是为了防止流行的错别字。如果速记赋值运算符只是,那么您可能会遇到以下情况::
=
=
var myNumb String = "one"
myNumb = "two"
现在创建该代码的用户是否打算重新分配two
给myNumb
,或者他是否输入错误myNumb
而不是正确输入myNumbTwo
?通过在 中包含冒号:=
,程序员必须犯两个错误(忘记冒号并忘记var
)才能产生错误,从而大大降低了这样做的可能性。