Go 經(jīng)典入門系列 3:變量
這是我們 Golang 系列教程的第 3 個教程,探討 Golang 里的變量(Variables)。
你可以閱讀 Golang 系列教程第 2 部分:Hello World,學(xué)習(xí)如何配置 Golang,并運(yùn)行 hello world 程序。
變量是什么
變量指定了某存儲單元(Memory Location)的名稱,該存儲單元會存儲特定類型的值。在 Go 中,有多種語法用于聲明變量。
聲明單個變量
var name type 是聲明單個變量的語法。
package?main
import?"fmt"
func?main()?{
????var?age?int?//?變量聲明
????fmt.Println("my?age?is",?age)
}
在線運(yùn)行程序[1]
語句 var age int 聲明了一個 int 類型的變量,名字為 age。我們還沒有給該變量賦值。如果變量未被賦值,Go 會自動地將其初始化,賦值該變量類型的零值(Zero Value)。本例中 age 就被賦值為 0。如果你運(yùn)行該程序,你會看到如下輸出:
my?age?is?0
變量可以賦值為本類型的任何值。上一程序中的 age 可以賦值為任何整型值(Integer Value)。
package?main
import?"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)
}
在線運(yùn)行程序[2]
上面的程序會有如下輸出:
my?age?is??0
my?age?is?29
my?new?age?is?54
聲明變量并初始化
聲明變量的同時可以給定初始值。
var name type = initialvalue 的語法用于聲明變量并初始化。
package?main
import?"fmt"
func?main()?{
????var?age?int?=?29?//?聲明變量并初始化
????fmt.Println("my?age?is",?age)
}
在線運(yùn)行程序[3]
在上面的程序中,age 是具有初始值 29 的 int 類型變量。如果你運(yùn)行上面的程序,你可以看見下面的輸出,證實 age 已經(jīng)被初始化為 29。
my?age?is?29
類型推斷(Type Inference)
如果變量有初始值,那么 Go 能夠自動推斷具有初始值的變量的類型。因此,如果變量有初始值,就可以在變量聲明中省略 type。
如果變量聲明的語法是 var name = initialvalue,Go 能夠根據(jù)初始值自動推斷變量的類型。
在下面的例子中,你可以看到在第 6 行,我們省略了變量 age 的 int 類型,Go 依然推斷出了它是 int 類型。
package?main
import?"fmt"
func?main()?{
????var?age?=?29?//?可以推斷類型
????fmt.Println("my?age?is",?age)
}
在線運(yùn)行程序[4]
聲明多個變量
Go 能夠通過一條語句聲明多個變量。
聲明多個變量的語法是 var name1, name2 type = initialvalue1, initialvalue2。
package?main
import?"fmt"
func?main()?{
????var?width,?height?int?=?100,?50?//?聲明多個變量
????fmt.Println("width?is",?width,?"height?is",?heigh)
}
在線運(yùn)行程序[5]
上述程序?qū)⒃跇?biāo)準(zhǔn)輸出打印 width is 100 height is 50。
你可能已經(jīng)想到,如果 width 和 height 省略了初始化,它們的初始值將賦值為 0。
package?main
import?"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)
}
在線運(yùn)行程序[6]
上面的程序?qū)蛴。?/p>
width?is?0?height?is?0
new?width?is?100?new?height?is??50
在有些情況下,我們可能會想要在一個語句中聲明不同類型的變量。其語法如下:
var?(
????name1?=?initialvalue1,
????name2?=?initialvalue2
)
使用上述語法,下面的程序聲明不同類型的變量。
package?main
import?"fmt"
func?main()?{
????var?(
????????name???=?"naveen"
????????age????=?29
????????height?int
????)
????fmt.Println("my?name?is",?name,?",?age?is",?age,?"and?height?is",?height)
}
在線運(yùn)行程序[7]
這里我們聲明了 string 類型的 name、int 類型的 age 和 height(我們將會在下一教程中討論 golang 所支持的變量類型)。運(yùn)行上面的程序會產(chǎn)生輸出 my name is naveen , age is 29 and height is 0。
簡短聲明
Go 也支持一種聲明變量的簡潔形式,稱為簡短聲明(Short Hand Declaration),該聲明使用了 := 操作符。
聲明變量的簡短語法是 name := initialvalue。
package?main
import?"fmt"
func?main()?{
????name,?age?:=?"naveen",?29?//?簡短聲明
????fmt.Println("my?name?is",?name,?"age?is",?age)
}
在線運(yùn)行程序[8]
運(yùn)行上面的程序,可以看到輸出為 my name is naveen age is 29。
簡短聲明要求 := 操作符左邊的所有變量都有初始值。下面程序?qū)伋鲥e誤 cannot assign 1 values to 2 variables,這是因為 age 沒有被賦值。
package?main
import?"fmt"
func?main()?{
????name,?age?:=?"naveen"?//error
????fmt.Println("my?name?is",?name,?"age?is",?age)
}
在線運(yùn)行程序[9]
簡短聲明的語法要求 := 操作符的左邊至少有一個變量是尚未聲明的。考慮下面的程序:
package?main
import?"fmt"
func?main()?{
????a,?b?:=?20,?30?//?聲明變量a和b
????fmt.Println("a?is",?a,?"b?is",?b)
????b,?c?:=?40,?50?//?b已經(jīng)聲明,但c尚未聲明
????fmt.Println("b?is",?b,?"c?is",?c)
????b,?c?=?80,?90?//?給已經(jīng)聲明的變量b和c賦新值
????fmt.Println("changed?b?is",?b,?"c?is",?c)
}
在線運(yùn)行程序[10]
在上面程序中的第 8 行,由于 b 已經(jīng)被聲明,而 c 尚未聲明,因此運(yùn)行成功并且輸出:
a?is?20?b?is?30
b?is?40?c?is?50
changed?b?is?80?c?is?90
但是如果我們運(yùn)行下面的程序:
package?main
import?"fmt"
func?main()?{
????a,?b?:=?20,?30?//?聲明a和b
????fmt.Println("a?is",?a,?"b?is",?b)
????a,?b?:=?40,?50?//?錯誤,沒有尚未聲明的變量
}
在線運(yùn)行程序[11]
上面運(yùn)行后會拋出 no new variables on left side of := 的錯誤,這是因為 a 和 b 的變量已經(jīng)聲明過了,:= 的左邊并沒有尚未聲明的變量。
變量也可以在運(yùn)行時進(jìn)行賦值。考慮下面的程序:
package?main
import?(
????"fmt"
????"math"
)
func?main()?{
????a,?b?:=?145.8,?543.8
????c?:=?math.Min(a,?b)
????fmt.Println("minimum?value?is?",?c)
}
在線運(yùn)行程序[12]
在上面的程序中,c 的值是運(yùn)行過程中計算得到的,即 a 和 b 的最小值。上述程序會打印:
minimum?value?is??145.8
由于 Go 是強(qiáng)類型(Strongly Typed)語言,因此不允許某一類型的變量賦值為其他類型的值。下面的程序會拋出錯誤 cannot use "naveen" (type string) as type int in assignment,這是因為 age 本來聲明為 int 類型,而我們卻嘗試給它賦字符串類型的值。
package?main
func?main()?{
????age?:=?29??????//?age是int類型
????age?=?"naveen"?//?錯誤,嘗試賦值一個字符串給int類型變量
}
在線運(yùn)行程序[13]
感謝您的閱讀,請在評論欄上面發(fā)布您的問題和反饋。
上一教程 - Hello World[14]
下一教程 - 類型[15]
via: https://golangbot.com/variables/
作者:Nick Coghlan[16]譯者:Noluye[17]校對:Unknwon[18]
本文由 GCTT[19] 原創(chuàng)編譯,Go 中文網(wǎng)[20] 榮譽(yù)推出
參考資料
在線運(yùn)行程序: https://play.golang.org/p/XrveIxw_YI
[2]在線運(yùn)行程序: https://play.golang.org/p/z4nKMjBxLx
[3]在線運(yùn)行程序: https://play.golang.org/p/TFfpzsrchh
[4]在線運(yùn)行程序: https://play.golang.org/p/FgNbfL3WIt
[5]在線運(yùn)行程序: https://play.golang.org/p/4aOQyt55ah
[6]在線運(yùn)行程序: https://play.golang.org/p/DM00pcBbsu
[7]在線運(yùn)行程序: https://play.golang.org/p/7pkp74h_9L
[8]在線運(yùn)行程序: https://play.golang.org/p/ctqgw4w6kx
[9]在線運(yùn)行程序: https://play.golang.org/p/wZd2HmDvqw
[10]在線運(yùn)行程序: https://play.golang.org/p/MSUYR8vazB
[11]在線運(yùn)行程序: https://play.golang.org/p/EYTtRnlDu3
[12]在線運(yùn)行程序: https://play.golang.org/p/7XojAtrpH9
[13]在線運(yùn)行程序: https://play.golang.org/p/K5rz4gxjPj
[14]Hello World: https://studygolang.com/articles/11755
[15]類型: https://studygolang.com/articles/11869
[16]Nick Coghlan: https://golangbot.com/about/
[17]Noluye: https://github.com/Noluye
[18]Unknwon: https://github.com/Unknwon
[19]GCTT: https://github.com/studygolang/GCTT
[20]Go 中文網(wǎng): https://studygolang.com/
推薦閱讀
