Go语言中的赋值运算符

Nen*_*nad 76 syntax go

最近我正在使用谷歌的新编程语言Go

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

Fab*_*ien 112

:=表示法既可用作声明,也可用作初始化.

foo := "bar"
Run Code Online (Sandbox Code Playgroud)

相当于

var foo = "bar"
Run Code Online (Sandbox Code Playgroud)

为什么foo = "bar"不像任何脚本语言一样使用,你可能会问?好吧,这是为了避免拼写错误.

foo = "bar"
fooo = "baz" + foo + "baz"   // Oops, is fooo a new variable or did I mean 'foo' ?
Run Code Online (Sandbox Code Playgroud)


Joo*_*zan 34

name := "John"
Run Code Online (Sandbox Code Playgroud)

只是语法糖

var name string
name = "John"
Run Code Online (Sandbox Code Playgroud)

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

  • @peterSO但是`var name ="John"`是`var name string ="John"的缩写,它是给定的两行的缩写. (11认同)
  • `name:="John"`是`var name ="John"`的简写. (6认同)
  • @peterSO我知道,我也读过这个.这并没有改变我说的话.这个答案是对的. (6认同)
  • @Dave C:[Go编程语言规范](http://golang.org/ref/spec#Short_variable_declarations)是明确的:"一个简短的变量声明...是带有初始化表达式的常规变量声明的简写,但没有types:`"var"IdentifierList = ExpressionList .`". (2认同)

pet*_*rSO 18

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

简短的变量声明

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

ShortVarDecl = IdentifierList ":=" ExpressionList .

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

"var" IdentifierList = ExpressionList .

分配

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

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


use*_*306 11

Rob Pike 在他的演讲"Origins of Go"(2010)中解释了为什么Go :=.

:=是Pike编写的另一种语言的伪算子叫做Newsquek(1989).其中包含Pascal-ish表示法和推断类型以声明和初始化成语的能力(第15页)

// variable: [type] = value
x: int = 1
x := 1
Run Code Online (Sandbox Code Playgroud)

边缘说明:罗伯特·格里塞默(Robert Griesemer) :=操作员回答"你从Go那里拿出什么东西?"这个问题.在Google I/O 2013的质量保证会议期间.将其称为方便但有问题.


Web*_*eng 6

答案的重要背景:

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

var myNumb String = "one"
myNumb := "one"
Run Code Online (Sandbox Code Playgroud)

回答:

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

var myNumb String = "one"
myNumb = "two"
Run Code Online (Sandbox Code Playgroud)

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


Pra*_*hra 5

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

var name string = "John" // is a variable declaration 
Run Code Online (Sandbox Code Playgroud)

name := "John"   // is a short variable declaration. 
Run Code Online (Sandbox Code Playgroud)

短变量声明是带有初始值设定项表达式但没有类型的常规变量声明的简写。

详细阅读以下内容:

变量声明

简短的变量声明


小智 5

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

name := "John"
Run Code Online (Sandbox Code Playgroud)

var name = "John"
Run Code Online (Sandbox Code Playgroud)

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