93

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

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

4

7 回答 7

130

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

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' ?
于 2013-05-13T11:59:10.723 回答
44
name := "John"

只是语法糖

var name string
name = "John"

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

于 2013-05-13T12:00:55.577 回答
20

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

简短的变量声明

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

ShortVarDecl = IdentifierList ":=" ExpressionList .

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

"var" IdentifierList = ExpressionList .

作业

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

在 Go 中,name := "John"var name = "John".

于 2013-05-13T11:58:33.267 回答
14

Rob Pike在他的演讲“围棋的起源”(2010 年)中解释了围棋的原因。:=

:=是由 Pike 代号为 Newsquek (1989) 的另一种语言的伪算子。它具有 Pascal-ish 表示法和推断类型以声明和初始化习语的能力(第 15 页

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

旁注: Robert Griesemer提出 :=操作员回答问题“你从 Go 中取出的一件事是什么?” 在 Google I/O 2013 的 QA 会议期间。将其称为方便但有问题

于 2016-03-10T09:31:39.470 回答
6

两者之间至少存在一个细微差别

name := "John"

var name = "John"

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

于 2018-06-15T12:41:11.400 回答
4

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

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

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

短变量声明是具有初始化表达式但没有类型的常规变量声明的简写。

详细阅读以下内容:

变量声明

简短的变量声明

于 2014-08-13T01:10:58.517 回答
3

答案的重要背景:

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

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

回答:

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

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

现在创建该代码的用户是否打算重新分配twomyNumb,或者他是否输入错误myNumb而不是正确输入myNumbTwo?通过在 中包含冒号:=,程序员必须犯两个错误(忘记冒号并忘记var)才能产生错误,从而大大降低了这样做的可能性。

于 2016-07-06T15:37:07.210 回答