2016-04-09 60 views
2

我是Go編程語言的新手。Go和=之間有什麼區別?

我在Go中發現了一些奇怪的東西:我認爲它使用:=並用Python代替=,但是當我在Go中使用=時也是有效的。

:==有什麼區別?

+0

https://tour.golang.org/basics/10 – Deadlock

回答

5

=被賦值。更多關於分配在Go:Assignments

=:=之間的微妙差別是當變量聲明使用=

在Go變量聲明的一般形式爲:

var name type = expression 

上述聲明創建一個特定類型的變量,附加一個名稱給它,並設置它的初始值。 type= expression可以省略,但不能同時爲兩者。

例如:

var x int = 1 
var a int 
var b, c, d = 3.14, "stackoverflow", true 

:=稱爲short variable declaration這需要形式

name := expression 

和名稱的類型是由表達式的類型確定

注意的是::=是一個聲明,而=是一個賦值

因此,一個短變量聲明必須聲明至少有一個新變量。這意味着一個短變量聲明不一定會在其左側聲明所有變量,當其中一些變量已經在同一個詞法塊中聲明時,那麼:=就像對這些變量的賦值一樣起作用

例如:

r := foo() // ok, declare a new variable r 
r, m := bar() // ok, declare a new variable m and assign r a new value 
r, m := bar2() //compile error: no new variables 

此外,:=可能只出現在函數內部。在某些情況下,如「if」,「for」或「switch」語句的初始值設定項,它們可用於聲明本地臨時變量。

更多信息:

variable declarations

short variable declarations

+1

所以內部{}使用:=表示聲明新的變量,即使存在相同名稱的外部同名變量{}? –

+2

是的,這是一個新的。一個{}是一個詞塊,不同的詞塊是不同的範圍。但在實踐中使用相同的名稱通常不是一個好的風格。 @whale_steward –

2

在函數內部,可以使用:=簡短賦值語句來代替具有隱式類型的var聲明。

例如:

package main 

import "fmt" 

func main() { 
    var i, j int = 1, 2 
    k := 3 
    c, python, java := true, false, "no!" 

    fmt.Println(i, j, k, c, python, java) 
} 

注意::=聲明的變量只能在功能塊內使用。

1

:=是聲明和初始化變量的「短聲明表單」。它會根據您分配的值來設置變量的類型。

如果您嘗試將短聲明表單分配給同一範圍內的相同變量,則編譯器將引發錯誤。

是在尋找對短期申報表「陰影」相同的變量在一個封閉的範圍內(特別是與錯誤)

=聲明一個變量,該變量的類型明確以下變量名稱時需要var關鍵字。你實際上可以離開聲明,因爲Go對所有類型都有一個初始值(字符串初始化爲「」,整數是0,片是空片)。它也可以被用於具有隻是一個值重新分配,即

var s string = "a string" // declared and initialized to "a string" 
s = "something else"  // value is reassigned 

var n int // declared and initialized to 0 
n = 3 
2

=只是分配

:=是聲明和初始化構建功能塊內新瓦爾(至少一個新的變種) (不全球):

var u1 uint32  //declare a variable and init with 0 
u1 = 32   //assign its value 
var u2 uint32 = 32 //declare a variable and assign its value at once 
//declare a new variable with defining data type: 
u3 := uint32(32)  //inside the function block this is equal to: var u3 uint32 = 32 
fmt.Println(u1, u2, u3) //32 32 32 
//u3 := 20//err: no new variables on left side of := 
u3 = 20 
fmt.Println(u1, u2, u3) //32 32 20 
u3, str4 := 100, "str"  // at least one new var 
fmt.Println(u1, u2, u3, str4) //32 32 100 str 
相關問題