=和:=操作符之间的区别是什么,它们的用例是什么?他们似乎都是来执行任务的?


当前回答

正如其他人已经解释过的,:=既用于声明、赋值,也用于重声明;并且它自动猜测(推断)变量的类型。

例如,foo:= 32是:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ There are some rules: /

第一条规则:

你不能在funcs之外使用:=。这是因为,在func之外,语句应该以关键字开头。

// 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

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

你可以在“多变量”声明中使用它们两次,如果其中一个变量是新的:

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是合法的,因为它在some() func的作用域中声明了foo。Foo = 314是合法的,因为它只是给Foo赋了一个新值。


★第六条规则:

你可以在短语句块中声明相同的名称,如:if, for, switch:

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

因为,foo在if foo:=…,只属于if子句,而且它在不同的作用域中。


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

引用:

短变量声明规则 Go变量的可视化指南

其他回答

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

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

:=表示声明和赋值,而=表示简单地赋值。

:=声明并赋值,=只是赋值

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

// 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)

:=是声明的简写。

a := 10
b := "gopher"

A将被声明为int并初始化为值10,其中as b将被声明为字符串并初始化为值gopher。

它们的等价物使用=将是

var a = 10
var b = "gopher"

=是赋值运算符。它的使用方式与你在任何其他语言中使用它的方式相同。

当声明变量并且有初始化式时,可以省略该类型(http://tour.golang.org/#11)。

参考文档:(tour.golang.org)

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

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