Go语言中的赋值运算符

mlmc2os5  于 2023-03-27  发布在  Go
关注(0)|答案(7)|浏览(159)

最近我在玩google的新编程语言Go,我想知道为什么赋值运算符:=在等号=前面有一个 * 冒号 *。
为什么语言的作者想要使用name := "John"而不是name = "John"

kb5ga3dv

kb5ga3dv1#

:=表示法既可以作为声明,也可以作为初始化。

foo := "bar"

相当于

var foo = "bar"

您可能会问,为什么不像在任何脚本语言中那样只使用foo = "bar"呢?

foo = "bar"
fooo = "baz" + foo + "baz"   // Oops, is fooo a new variable or did I mean 'foo' ?
hpcdzsge

hpcdzsge2#

name := "John"

只是语法糖

var name string
name = "John"

Go是静态类型的,所以你必须声明变量。

isr3a4wc

isr3a4wc3#

:=不是赋值运算符。它是一个简短的变量声明。=是赋值运算符。
短变量声明
短变量声明使用以下语法:
ShortVarDecl = IdentifierList ":=" ExpressionList .
它是一个带有初始化表达式但没有类型的正则变量声明的简写:
"var" IdentifierList = ExpressionList .
任务
Assignment = ExpressionList assign_op ExpressionList .
assign_op = [ add_op | mul_op ] "=" .
在Go语言中,name := "John"var name = "John"的简写。

kmb7vmvb

kmb7vmvb4#

Rob Pike在2010年的“围棋的起源”演讲中解释了为什么围棋有:=
:=是Pike在Newsquek(1989)中共同设计的一种伪操作符,它具有Pascal式的符号,能够推断类型以声明和初始化习惯用法(page 15)。

// variable: [type] = value
x: int = 1
x := 1
  • 旁注:* Robert Griesemer brings up:=运算符在Google I/O 2013的QA会议上回答了“你会从Go中取出什么东西?”的问题。将其称为“方便但有问题”。
mnowg1ta

mnowg1ta5#

之间至少有一个细微的区别

name := "John"

var name = "John"

前者是一个非声明语句,不允许在函数体之外,而后者是包级别的有效语句。

odopli94

odopli946#

答案的重要上下文:

:=是初始化变量的一个简写运算符,在Go中,以下操作是等价的:

var myNumb String = "one"
myNumb := "one"

答案:

现在隐含的问题是:“为什么要设计简写符号:==之前有一个:?"。原因是为了防止普遍的错别字。如果简写赋值运算符只是=,那么你可能会遇到以下情况:

var myNumb String = "one"
myNumb = "two"

那么,创建该代码的用户是否打算将two重新分配给myNumb,或者他是否错误地键入了myNumb,而不是正确地键入myNumbTwo?(忘记冒号和忘记var),以便有一个bug,因此大大降低了这样做的概率**。

z9zf31ra

z9zf31ra7#

两者都是Go语言中变量声明的不同技术。

var name string = "John" // is a variable declaration

name := "John"   // is a short variable declaration.

短变量声明是具有初始化表达式但没有类型的常规变量声明的简写。
详情请阅读下文:
变量声明
短变量声明

相关问题