2013-07-26 95 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