Go语言的赋值运算符


83

最近我在玩Google的新编程语言Go

并且想知道为什么赋值运算符为什么在:=等号前面有一个冒号= ?语言的作者为什么要使用name := "John"而不是name = "John"


很好的问题,答案是使用=进行赋值是一个错误。您很早就知道x + 2 = 4是一个方程式,而不是赋值。但是,由于赋值要比检查相等性要频繁得多,因此某些主流语言在早期就开始使用“ =”进行赋值……并且约定仍然存在。
Rick O'Shea

Answers:


120

:=符号既用作声明,又用作初始化。

foo := "bar"

相当于

var foo = "bar"

foo = "bar"您可能会问,为什么不像只使用任何脚本语言一样使用?好吧,那是为了避免错别字。

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

39
name := "John"

只是语法糖

var name string
name = "John"

Go是静态类型的,因此您必须声明变量。


6
name := "John"是的简写var name = "John"
peterSO

13
@peterSO,但var name = "John"缩写为var name string = "John"给定的两行。
戴夫C

2
@Dave C:Go编程语言规范是明确的:“简短的变量声明...是带有初始化表达式但没有类型的常规变量声明的简写:"var" IdentifierList = ExpressionList .”。
peterSO

7
@peterSO我知道,我也读过。那并没有改变我的意思。这个答案是正确的。
Dave C

1
@KennethWorden它如何影响可读性?它将不必要的信息减至最少。具有完整类型推断的语言是说明这是一件好事的一个很好的例子。
Joonazan

18

:=不是赋值运算符。这是一个简短的变量声明。=是赋值运算符。

简短的变量声明

简短的变量声明使用以下语法:

ShortVarDecl = IdentifierList ":=" ExpressionList .

这是带有初始化表达式但没有类型的常规变量声明的简写:

"var" IdentifierList = ExpressionList .

作业

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

在Go中,name := "John"是的简写var name = "John"


11

罗伯·派克(Rob Pike)在演讲“围棋起源”(2010)中解释了围棋为什么会如此:=

:=是用派克(Dike)签名的另一种语言称为Newsquek(1989)的伪运算符。具有Pascal式表示法并能够推断类型以进行声明和初始化习惯用法(第15页

// variable: [type] = value
x: int = 1
x := 1

边注: Robert Griesemer提出了一个 :=操作员,回答问题“从Go中拿走一件事是什么?” 在Google I / O 2013的质量检查会议期间进行。称为“方便但有问题”



4

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

name := "John"

var name = "John"

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


2

答案的重要背景:

:=是用于初始化变量的简写运算符。在Go中,以下操作是等效的:

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

回答:

现在的隐含的问题是:“为什么去设计速记符号:=:=?”。原因是为了防止常见的错别字。如果速记运算符是just =,那么您可能会遇到以下情况:

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

现在,创建该代码的用户是否打算重新分配two给该用户myNumb,还是输入错误myNumb而不是正确输入myNumbTwo?通过将冒号包含在内:=,程序员将不得不犯两个错误(忘记冒号而忘记了var)以产生错误,从而大大降低了这样做的可能性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.