最近我在玩google的新编程语言Go,我想知道为什么赋值运算符:=在等号=前面有一个 * 冒号 *。为什么语言的作者想要使用name := "John"而不是name = "John"?
:=
=
name := "John"
name = "John"
kb5ga3dv1#
:=表示法既可以作为声明,也可以作为初始化。
foo := "bar"
相当于
var foo = "bar"
您可能会问,为什么不像在任何脚本语言中那样只使用foo = "bar"呢?
foo = "bar"
foo = "bar" fooo = "baz" + foo + "baz" // Oops, is fooo a new variable or did I mean 'foo' ?
hpcdzsge2#
只是语法糖
var name string name = "John"
Go是静态类型的,所以你必须声明变量。
isr3a4wc3#
:=不是赋值运算符。它是一个简短的变量声明。=是赋值运算符。短变量声明短变量声明使用以下语法:ShortVarDecl = IdentifierList ":=" ExpressionList .它是一个带有初始化表达式但没有类型的正则变量声明的简写:"var" IdentifierList = ExpressionList .任务Assignment = ExpressionList assign_op ExpressionList .assign_op = [ add_op | mul_op ] "=" .在Go语言中,name := "John"是var name = "John"的简写。
ShortVarDecl = IdentifierList ":=" ExpressionList .
"var" IdentifierList = ExpressionList .
Assignment = ExpressionList assign_op ExpressionList .
assign_op = [ add_op | mul_op ] "=" .
var name = "John"
kmb7vmvb4#
Rob Pike在2010年的“围棋的起源”演讲中解释了为什么围棋有:=。:=是Pike在Newsquek(1989)中共同设计的一种伪操作符,它具有Pascal式的符号,能够推断类型以声明和初始化习惯用法(page 15)。
// variable: [type] = value x: int = 1 x := 1
mnowg1ta5#
之间至少有一个细微的区别
和
前者是一个非声明语句,不允许在函数体之外,而后者是包级别的有效语句。
odopli946#
答案的重要上下文:
:=是初始化变量的一个简写运算符,在Go中,以下操作是等价的:
var myNumb String = "one" myNumb := "one"
答案:
现在隐含的问题是:“为什么要设计简写符号:=在=之前有一个:?"。原因是为了防止普遍的错别字。如果简写赋值运算符只是=,那么你可能会遇到以下情况:
:
var myNumb String = "one" myNumb = "two"
那么,创建该代码的用户是否打算将two重新分配给myNumb,或者他是否错误地键入了myNumb,而不是正确地键入myNumbTwo?(忘记冒号和忘记var),以便有一个bug,因此大大降低了这样做的概率**。
two
myNumb
myNumbTwo
var
z9zf31ra7#
两者都是Go语言中变量声明的不同技术。
var name string = "John" // is a variable declaration
name := "John" // is a short variable declaration.
短变量声明是具有初始化表达式但没有类型的常规变量声明的简写。详情请阅读下文:变量声明短变量声明
7条答案
按热度按时间kb5ga3dv1#
:=
表示法既可以作为声明,也可以作为初始化。相当于
您可能会问,为什么不像在任何脚本语言中那样只使用
foo = "bar"
呢?hpcdzsge2#
只是语法糖
Go是静态类型的,所以你必须声明变量。
isr3a4wc3#
:=
不是赋值运算符。它是一个简短的变量声明。=
是赋值运算符。短变量声明
短变量声明使用以下语法:
ShortVarDecl = IdentifierList ":=" ExpressionList .
它是一个带有初始化表达式但没有类型的正则变量声明的简写:
"var" IdentifierList = ExpressionList .
任务
Assignment = ExpressionList assign_op ExpressionList .
assign_op = [ add_op | mul_op ] "=" .
在Go语言中,
name := "John"
是var name = "John"
的简写。kmb7vmvb4#
Rob Pike在2010年的“围棋的起源”演讲中解释了为什么围棋有
:=
。:=
是Pike在Newsquek(1989)中共同设计的一种伪操作符,它具有Pascal式的符号,能够推断类型以声明和初始化习惯用法(page 15)。:=
运算符在Google I/O 2013的QA会议上回答了“你会从Go中取出什么东西?”的问题。将其称为“方便但有问题”。mnowg1ta5#
之间至少有一个细微的区别
和
前者是一个非声明语句,不允许在函数体之外,而后者是包级别的有效语句。
odopli946#
答案的重要上下文:
:=
是初始化变量的一个简写运算符,在Go中,以下操作是等价的:答案:
现在隐含的问题是:“为什么要设计简写符号
:=
在=
之前有一个:
?"。原因是为了防止普遍的错别字。如果简写赋值运算符只是=
,那么你可能会遇到以下情况:那么,创建该代码的用户是否打算将
two
重新分配给myNumb
,或者他是否错误地键入了myNumb
,而不是正确地键入myNumbTwo
?(忘记冒号和忘记var
),以便有一个bug,因此大大降低了这样做的概率**。z9zf31ra7#
两者都是Go语言中变量声明的不同技术。
和
短变量声明是具有初始化表达式但没有类型的常规变量声明的简写。
详情请阅读下文:
变量声明
短变量声明