Go中的:=和=运算符之间的区别


283

=:=运算符之间有什么区别,它们的用例是什么?他们俩似乎都是为了一项任务?


2
另请参阅Go变量可视指南。我写了一篇关于它的文章。
伊南克·古姆斯

1
语义...
JustDave

例如,如果要使用特定类型x := uint32(123)。对于大多数人来说,这肯定是显而易见的,但是我不得不思考几分钟;-)
野口健二(Kenji Noguchi)

Answers:


198

=是赋值运算符。

:=Short变量声明子句语法的一部分。

though虽然有一些规则。有关更多详细信息,请参见此其他答案


那么这是否意味着具有推断类型的变量?对?
克鲁帕尔·沙

@KrupalShah链接到文档字面上说- “这是简写形式,一个普通变量声明与初始化表达式,但没有类型:” golang.org/ref/spec#Short_variable_declarations
akshaynagpal

1
看起来像:=在这里被列为运算符golang.org/ref/spec#Operators_and_punctuation,所以我不确定我是否同意“ :=实际上不是运算符”
Powers

347

在Go中,:=用于声明+赋值,而=仅用于赋值。

例如,var foo int = 10 与相同foo := 10


4
=相对于的用例:=吗?您应该一直使用:=吗?
肯尼·沃登

3
@KennethWorden Go不允许您使用:=已分配的变量,除非您一次要分配多个变量,并且其中至少有一个是新变量。
肯尼·巴尼亚

5
int不是必需的,var foo = 10foo := 10
Gary Lyn's

@KennyWorden,是的。您不能在函数外部使用:=。
卡鲁汉加

104

正如其他人已经解释的那样,:=它既用于声明,分配,又用于重新声明。它会自动猜测(推断)变量的类型。

例如,foo := 32是以下形式的简写形式:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ *有一些规则:* /

★第一法则:

您不能使用:=out funcs。这是因为,在所有函数中,语句都应以关键字开头。

// no keywords below, illegal.
illegal := 42

// `var` keyword makes this statement legal.
var legal = 42

func foo() {
  alsoLegal := 42
  // reason: it's in a func scope.
}

★第二条规则:

您不能使用它们两次(在同一范围内):

legal := 42
legal := 42 // <-- error

因为,:=引入了“新变量”,因此两次使用它不会重新声明第二个变量,因此是非法的。


★第三法则:

您可以将它们用于多变量声明和赋值:

foo, bar   := 42, 314
jazz, bazz := 22, 7

★第四条规则(重新声明):

如果变量之一是new可以在“多变量”声明中使用它们两次:

foo, bar  := someFunc()
foo, jazz := someFunc()  // <-- jazz is new
baz, foo  := someFunc()  // <-- baz is new

这是合法的,因为您不是在声明所有变量,而是在将新值重新分配给现有变量,并同时声明新变量。这称为重新声明


★第五法则:

您可以使用简短声明在较新的范围内声明变量,即使该变量之前已经用相同的名称声明过:

var foo int = 34

func some() {
  // because foo here is scoped to some func
  foo := 42  // <-- legal
  foo = 314  // <-- legal
}

在这里,foo := 42是合法的,因为,它foosome()func的范围内声明。foo = 314是合法的,因为它只是为分配了一个新值foo


★第六法则:

您可以在简短的语句块中声明相同的名称,例如:ifforswitch

foo := 42
if foo := someFunc(); foo == 314 {
  // foo is scoped to 314 here
  // ...
}
// foo is still 42 here

因为fooin中的if foo := ...,仅属于该if子句,并且在不同的范围内。


因此,作为一般规则:如果要轻松声明一个变量,可以使用:=;或者,如果只想覆盖一个现有变量,则可以使用=

参考文献:


21

:= 是声明的简写。

a := 10
b := "gopher"

a将被声明为int并使用value初始化,10其中as b将被声明为一个字符串并使用value初始化gopher

其等效使用=将是

var a = 10
var b = "gopher"

=是赋值运算符。它的使用方式与其他任何语言一样。

声明变量时,可以省略类型,并且存在初始化程序(http://tour.golang.org/#11)。


«=是赋值运算符。它的使用方式与您使用其他任何语言一样。» 除了艾达(Ada =)只是比较和:=分配...
亚历克西斯·威尔克


11

:=声明和分配,=只是分配

当您不想用类型或结构声明来填充代码时,这很有用。

// Usage with =
var i int
var U, V, W float64
var k = 0
var x, y float32 = -1, -2

// Usage with :=
i, j := 0, 10
f := func() int { return 7 }
ch := make(chan int)

7

来自参考文档:(tour.golang.org

在函数内部:=可以使用短赋值语句代替具有隐式类型的var声明。

在函数外部,每个构造都以关键字(var,func等)开头,并且:=构造不可用。



2

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

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

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

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

详细阅读以下内容:

变量声明

简短的变量声明


10
我认为第一个示例的语法错误。而不是:var firstName:=“ John”,应该是:var firstName =“ John”
Gino
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.