Go语言中:=和=操作符的区别

hsvhsicv  于 2023-03-27  发布在  Go
关注(0)|答案(8)|浏览(163)

=:=运算符之间有什么区别,它们的用例是什么?它们似乎都用于赋值?

bvk5enib

bvk5enib1#

在Go语言中,:=用于声明+赋值,而=仅用于赋值。
例如,var foo int = 10foo := 10相同。

00jrzges

00jrzges2#

TLDR:

  • 声明一个变量,用途::=
  • 更改变量的值,用途:= .
  • 有一些规则,TLDR并不总是正确的。*

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

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

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ 规则如下:/**
★第一条规则:

你不能在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

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

可以在**“多变量”声明中使用两次, 如果其中一个变量是new

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

这是法律的的,因为,你没有声明所有的变量,你只是重新分配新的值给现有的变量,同时声明新的变量。这被称为 redeclaration

★第五条:

你可以使用短声明在一个新的作用域中声明一个变量,即使该变量已经在之前用相同的名字声明过:

var foo int = 34

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

在这里,foo := 42是法律的的,因为它在some() func的作用域中声明了foofoo = 314是合法的,因为它只是给foo赋值。

★第六条:

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

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

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

参考资料:

thtygnil

thtygnil3#

只有=是 * 赋值运算符 *。
:=short variable declaration 子句语法的一部分。
👉 不过还是有一些规则的,详见this other answer

tktrz96b

tktrz96b4#

:=是声明的缩写。

a := 10
b := "gopher"

a将被声明为int并使用值10初始化,其中b将被声明为字符串并使用值gopher初始化。
使用=时,它们的等效值为

var a = 10
var b = "gopher"

=是赋值运算符。它的使用方式与在任何其他语言中使用它的方式相同。
当声明变量时,如果有初始化器,可以省略类型(http://tour.golang.org/#11)。

9udxz4iz

9udxz4iz5#

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

axr492tv

axr492tv6#

:=声明并赋值,=仅赋值
当您不想用类型或结构声明填充代码时,它很有用。

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

wn9m85ua7#

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

在函数内部,可以使用:=短赋值语句代替隐式类型的var声明。
在函数外部,每个构造都以关键字(var、func等)开头,并且:=构造不可用。

klh5stk1

klh5stk18#

在Go语言中,:=也用于声明和赋值,而=只用于赋值
例如:

var s string = "Omkar"

s:= "Omkar"

相关问题