這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。這是我們 [Golang 系列教程](/subject/2)的第 3 個教程,探討 Golang 裡的變數(Variables)。你可以閱讀 Golang 系列 [**教程第 2 部分:Hello World**](/articles/11755),學習如何配置 Golang,並運行 Hello World 程式。### 變數是什麼變數指定了某儲存單元(Memory Location)的名稱,該儲存單元會儲存特定類型的值。在 Go 中,有多種文法用於聲明變數。### 聲明單個變數**var name type** 是聲明單個變數的文法。```gopackage mainimport "fmt"func main() { var age int // 變數聲明 fmt.Println("my age is", age)}```[線上運行程式](https://play.golang.org/p/XrveIxw_YI)語句 `var age int` 聲明了一個 int 類型的變數,名字為 age。我們還沒有給該變數賦值。如果變數未被賦值,Go 會自動地將其初始化,賦值該變數類型的零值(Zero Value)。本例中 age 就被賦值為 0。如果你運行該程式,你會看到如下輸出:```my age is 0```變數可以賦值為本類型的任何值。上一程式中的 age 可以賦值為任何整型值(Integer Value)。```gopackage mainimport "fmt"func main() { var age int // 變數聲明 fmt.Println("my age is", age) age = 29 // 賦值 fmt.Println("my age is", age) age = 54 // 賦值 fmt.Println("my new age is", age)}```[線上運行程式](https://play.golang.org/p/z4nKMjBxLx)上面的程式會有如下輸出:```my age is 0 my age is 29 my new age is 54 ```### 聲明變數並初始化聲明變數的同時可以給定初始值。**var name type = initialvalue** 的文法用於聲明變數並初始化。```gopackage mainimport "fmt"func main() { var age int = 29 // 聲明變數並初始化 fmt.Println("my age is", age)}```[線上運行程式](https://play.golang.org/p/TFfpzsrchh)在上面的程式中,age 是具有初始值 29 的 int 類型變數。如果你運行上面的程式,你可以看見下面的輸出,證實 age 已經被初始化為 29。```my age is 29```### 類型推斷(Type Inference)如果變數有初始值,那麼 Go 能夠自動推斷具有初始值的變數的類型。因此,如果變數有初始值,就可以在變數聲明中省略 `type`。如果變數聲明的文法是 **var name = initialvalue**,Go 能夠根據初始值自動推斷變數的類型。在下面的例子中,你可以看到在第 6 行,我們省略了變數 `age` 的 `int` 類型,Go 依然推斷出了它是 int 類型。```gopackage mainimport "fmt"func main() { var age = 29 // 可以推斷類型 fmt.Println("my age is", age)}```[線上運行程式](https://play.golang.org/p/FgNbfL3WIt)### 聲明多個變數Go 能夠通過一條語句聲明多個變數。聲明多個變數的文法是 **var name1, name2 type = initialvalue1, initialvalue2**。```gopackage mainimport "fmt"func main() { var width, height int = 100, 50 // 聲明多個變數 fmt.Println("width is", width, "height is", heigh)}```[線上運行程式](https://play.golang.org/p/4aOQyt55ah)上述程式將在標準輸出列印 `width is 100 height is 50`。你可能已經想到,如果 width 和 height 省略了初始化,它們的初始值將賦值為 0。```gopackage mainimport "fmt"func main() { var width, height int fmt.Println("width is", width, "height is", height) width = 100 height = 50 fmt.Println("new width is", width, "new height is ", height)}```[線上運行程式](https://play.golang.org/p/DM00pcBbsu)上面的程式將會列印:```width is 0 height is 0 new width is 100 new height is 50 ```在有些情況下,我們可能會想要在一個語句中聲明不同類型的變數。其文法如下:```govar ( name1 = initialvalue1, name2 = initialvalue2)```使用上述文法,下面的程式聲明不同類型的變數。```gopackage mainimport "fmt"func main() { var ( name = "naveen" age = 29 height int ) fmt.Println("my name is", name, ", age is", age, "and height is", height)}```[線上運行程式](https://play.golang.org/p/7pkp74h_9L)這裡我們聲明了 **string 類型的 name、int 類型的 age 和 height**(我們將會在下一教程中討論 golang 所支援的變數類型)。運行上面的程式會產生輸出 `my name is naveen , age is 29 and height is 0`。### 簡短聲明Go 也支援一種聲明變數的簡潔形式,稱為簡短聲明(Short Hand Declaration),該聲明使用了 **:=** 操作符。聲明變數的簡短文法是 **name := initialvalue**。```gopackage mainimport "fmt"func main() { name, age := "naveen", 29 // 簡短聲明 fmt.Println("my name is", name, "age is", age)}```[線上運行程式](https://play.golang.org/p/ctqgw4w6kx)運行上面的程式,可以看到輸出為 `my name is naveen age is 29`。簡短聲明要求 **:=** 操作符左邊的所有變數都有初始值。下面程式將會拋出錯誤 `cannot assign 1 values to 2 variables`,這是因為 **age 沒有被賦值**。```gopackage mainimport "fmt"func main() { name, age := "naveen" //error fmt.Println("my name is", name, "age is", age)}```[線上運行程式](https://play.golang.org/p/wZd2HmDvqw)簡短聲明的文法要求 **:=** 操作符的左邊至少有一個變數是尚未聲明的。考慮下面的程式:```gopackage mainimport "fmt"func main() { a, b := 20, 30 // 聲明變數a和b fmt.Println("a is", a, "b is", b) b, c := 40, 50 // b已經聲明,但c尚未聲明 fmt.Println("b is", b, "c is", c) b, c = 80, 90 // 給已經聲明的變數b和c賦新值 fmt.Println("changed b is", b, "c is", c)}```[線上運行程式](https://play.golang.org/p/MSUYR8vazB)在上面程式中的第 8 行,由於 b 已經被聲明,而 c 尚未聲明,因此運行成功並且輸出:```a is 20 b is 30 b is 40 c is 50 changed b is 80 c is 90```但是如果我們運行下面的程式:```gopackage mainimport "fmt"func main() { a, b := 20, 30 // 聲明a和b fmt.Println("a is", a, "b is", b) a, b := 40, 50 // 錯誤,沒有尚未聲明的變數}```[線上運行程式](https://play.golang.org/p/EYTtRnlDu3)上面運行後會拋出 `no new variables on left side of :=` 的錯誤,這是因為 a 和 b 的變數已經聲明過了,**:=** 的左邊並沒有尚未聲明的變數。變數也可以在運行時進行賦值。考慮下面的程式:```gopackage mainimport ( "fmt" "math")func main() { a, b := 145.8, 543.8 c := math.Min(a, b) fmt.Println("minimum value is ", c)}```[線上運行程式](https://play.golang.org/p/7XojAtrpH9)在上面的程式中,c 的值是運行過程中計算得到的,即 a 和 b 的最小值。上述程式會列印:```minimum value is 145.8 ```由於 Go 是強型別(Strongly Typed)語言,因此不允許某一類型的變數賦值為其他類型的值。下面的程式會拋出錯誤 `cannot use "naveen" (type string) as type int in assignment`,這是因為 age 本來聲明為 int 類型,而我們卻嘗試給它賦字串類型的值。```gopackage mainfunc main() { age := 29 // age是int類型 age = "naveen" // 錯誤,嘗試賦值一個字串給int類型變數}```[線上運行程式](https://play.golang.org/p/K5rz4gxjPj)感謝您的閱讀,請在評論欄上面發布您的問題和反饋。**上一教程 - [Hello World](https://studygolang.com/articles/11755)****下一教程 - [類型](https://studygolang.com/articles/11869)**
via: https://golangbot.com/variables/
作者:Nick Coghlan 譯者:Noluye 校對:Unknwon
本文由 GCTT 原創編譯,Go語言中文網 榮譽推出
本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽
5422 次點擊 ∙ 1 贊