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

Chr*_*ris 245 go colon-equals

在Go中,=:=运营商有什么区别?他们似乎都是为了任务?这可能是显而易见的,但我似乎无法在文档中找到它.

Cha*_*aos 298

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

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

  • 这应该是答案.示例比仅仅是文档的链接更有用. (61认同)
  • 有一个用例`=`而不是`:=`?你应该总是使用`:=`? (3认同)
  • the `int` is not required, `var foo = 10` is the same as `foo := 10` (3认同)
  • @KennethWorden Go不会让你使用```:=```来赋值给已经声明的变量,除非你一次分配多个变量,并且这些变量中至少有一个是新的. (2认同)
  • @KennyWorden,是的。您不能在函数外部使用 := 。 (2认同)
  • 我相信 := 也用于类型推断,您可以像 ` i := 1 ` 一样使用它,而不是 ` var i int = 1 ` (2认同)

zzz*_*zzz 177

只有=赋值运算符.

:=实际上根本不是运营商.它是Short变量声明子句的语法的一部分.

  • 这个答案没有解释任何事情。抛出技术术语和一些链接并不是一个好的答案。[下面的答案](/sf/answers/1252390821/)使用比这更少的单词完美地解释了。 (5认同)

Ina*_*mus 72

正如其他人已经解释过的那样,:=无论是申报,转让,还是重新申报; 它会自动猜测(推断)变量的类型.

这是一种简短的形式:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32
Run Code Online (Sandbox Code Playgroud)

一些规则

您不能使用:=出来funcs.这是因为,在任何函数中,语句都应该以关键字开头.

illegal := 42

func foo() {
  legal := 42
}
Run Code Online (Sandbox Code Playgroud)

你不能使用它们两次(在相同的范围内):

legal := 42
legal := 42 // <-- error
Run Code Online (Sandbox Code Playgroud)

因为,:=引入"一个新变量",因此使用它两次不会重新声明第二个变量,所以它是非法的.


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

foo, bar  := someFunc()
foo, jazz := someFunc()  // <-- jazz is new
baz, foo  := someFunc()  // <-- baz is new
Run Code Online (Sandbox Code Playgroud)

这是合法的,因为,您没有声明所有变量,您只是将新值重新分配给现有变量,并同时声明新变量.


您可以使用简短声明在较新的范围内声明变量,即使该变量已在以下情况下使用相同的名称声明:

var foo int = 34

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

这里foo := 42是合法的,因为它foosome()func的范围内声明.foo = 314是合法的,因为它只是赋予一个新值foo.


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

foo, bar   := 42, 314
jazz, bazz := 22, 7
Run Code Online (Sandbox Code Playgroud)

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

foo := 42
if foo := someFunc(); foo == 314 {
  // foo is scoped to 314 here
  // ...
}
// foo is still 42 here
Run Code Online (Sandbox Code Playgroud)

因为,fooif foo := ...只属于该if条款,这是在不同的范围.


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

  • 感谢您提及所有用例. (4认同)

Shu*_*hya 21

:= 是宣言的简称.

a := 10
b := "gopher"
Run Code Online (Sandbox Code Playgroud)

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

他们使用的等价物=将是

var a = 10
var b = "gopher"
Run Code Online (Sandbox Code Playgroud)

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

在声明变量并且存在初始值设定项时,可以省略类型(http://tour.golang.org/#11).


Ral*_*veo 11

:=表示声明赋值,而=表示简单赋值.


Gus*_*tav 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)
Run Code Online (Sandbox Code Playgroud)


sub*_*ngh 7

来自参考文献:(tour.golang.org)

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

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