2013-07-26 50 views
130

在围棋上有什么=:=运营商之间的区别?他们似乎都是为了分配?这可能很明显,但我似乎无法在文档中找到它。Golang运营商的区别:= VS =

+1

**另请参阅此**:[Go Variables Visual Guide](https://blog.learngoprogramming.com/learn-go-lang-variables-visual-tutorial-and-ebook-9a061d29babe)。我写了一篇关于它的文章。 –

+0

语义... – JustDave

回答

106

只有=是赋值运算符。

:=其实并不是一个operator可言。它是Short variable declarations子句句法的一部分。

+1

感谢所有:D和感谢jnml链接到文档 – Chris

+0

所以它是否意味着变量与推断类型?对? –

6

的:=手段声明分配而=意味着简单地分配。

95

在围棋,:=是声明+赋值,而=仅用于分配。

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

+0

难道你不是指'var foo int = 10'吗?在Go中,类型位于变量名称后面。 – amon

+0

@amon对不起,我不太熟悉go语法,让我改变这个 – Chaos

+9

这应该是答案。示例非常有用,而不仅仅是文档的链接。 – rottenoats

9

:=声明和受让人,=只是分配

,当你不想填写您的代码类型或结构声明它是有用的。

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

:=是一个短期申报。

a := 10 
b := "gopher" 

a将被声明为int,并用值10其中作为b将被宣布为一个字符串,并用值gopher初始化初始化。

他们使用=当量将

var a = 10 
var b = "gopher" 

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

当你声明变量,则可以省略类型和初始化存在(http://tour.golang.org/#11)。

6

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

在函数,所述:=短赋值语句可以在适当位置以隐含类型一个变种声明的使用。

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

1

这两者都是Go语言中变量声明的不同方法。

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

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

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

阅读下面的细节:

Variable declarations

Short variable declarations

+6

我认为你的语法在第一个例子中是错误的。而不是:var firstName:=“John”,它应该是:var firstName =“John” – Gino

8

正如其他人已经解释过,:=是双方的声明和分配,并自动尝试猜测(推断)变量的类型。

它的短手形:

var foo int 
foo = 32 

// OR: 
var foo int = 32 

// OR: 
var foo = 32 

有些规则

不能使用:=funcs

illegal := 42 

func foo() { 
    legal := 42 
} 

不能使用他们两次:

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

因为,:=介绍“一个新的变量”,因此使用它两次不重新声明第二个变量,所以它的非法。


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

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的范围redeclares foofoo = 314是合法的,因为它只是为foo重新分配新值。

_


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

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

_


可以在作用域语句上下文喜欢重用他们:如果,开关

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

因为,if foo := ...分配,只对if条款访问。


所以,作为一般规则:除非你重新声明一个变量,你可以使用:=,或者,如果要覆盖现有的值,就可以使用=

+1

感谢您提及所有用例。 – AnirbanDebnath