Golang是靜態(tài)類(lèi)型語(yǔ)言,不能在運(yùn)行期間改變變量類(lèi)型冲粤。
變量
var 語(yǔ)句定義了一個(gè)變量的列表美莫;跟函數(shù)的參數(shù)列表一樣,類(lèi)型在后面梯捕。
初始化變量
使用關(guān)鍵字 var 定義變量厢呵,自動(dòng)初始化為零值。如果提供初始化值傀顾,可省略變量類(lèi)型襟铭,由編譯器自動(dòng)推斷。
package main
var x int
var f float32 = 1.6
var s = "abc"
func main() {
}
一次性定義多個(gè)變量。
package main
var x, y, z int
var s, n = "abc", 123
var (
a int
b float32
)
func main() {
n, s := 0x1234, "Hello, World!"
println(x, s, n)
}
輸出結(jié)果:
0 Hello, World! 4660
多變量賦值時(shí)寒砖,先計(jì)算所有相關(guān)值赐劣,然后再?gòu)淖蟮接乙来钨x值。
package main
import "fmt"
func main() {
data, i := [3]int{0, 1, 2}, 0
i, data[i] = 2, 100 // (i = 0) -> (i = 2), (data[0] = 100)
fmt.Println(i, data)
}
輸出結(jié)果:
2 [100 1 2]
變量定義可以包含初始值入撒,每個(gè)變量對(duì)應(yīng)一個(gè)隆豹。
package main
var i, j int = 1, 2
func main() {
}
如果初始化是使用表達(dá)式,則可以省略類(lèi)型茅逮;變量從初始值中獲得類(lèi)型璃赡。
package main
var c, python, java = true, false, "no!"
func main() {
}
短聲明變量
在函數(shù)內(nèi)部,可以使用更簡(jiǎn)略的 ":=" 方式定義變量献雅。":=" 簡(jiǎn)潔賦值語(yǔ)句在明確類(lèi)型的地方碉考,可以用于替代 var 定義。
package main
import (
"fmt"
)
var c, python, java = true, false, "no!"
func main() {
k := 3
c, python, java := false, true, "yes!"
fmt.Println(c, python, java, k)
//注意檢查挺身,是定義新的局部變量侯谁,還是修改全局變量。該方式容易造成錯(cuò)誤章钾!
}
輸出結(jié)果:
false true yes! 3
函數(shù)外的每個(gè)語(yǔ)句都必須以關(guān)鍵字開(kāi)始( var 墙贱、 func 、等等)贱傀, ":=" 結(jié)構(gòu)不能使用在函數(shù)外惨撇。
特殊只寫(xiě)變量 "_",用于忽略值占位府寒。
package main
func test() (int, string) {
return 1, "abc"
}
func main() {
_, s := test()
println(s)
}
輸出結(jié)果:
abc
編譯器會(huì)將未使 的局部變量當(dāng)做錯(cuò)誤魁衙。
package main
var s string // 全局變量沒(méi)問(wèn)題。
func main() {
i := 0 // ./main.go:6:7: i declared and not used
(可使 "_ = i" 規(guī)避)
}
注意重新賦值與定義新同名變量的區(qū)別株搔。
package main
func main() {
s := "abc"
println(&s)
s, y := "hello", 20 // 重新賦值: 與前 s 在同 層次的代碼塊中剖淀,且有新的變量被定義。
println(&s, y) // 通常函數(shù)多返回值 err 會(huì)被重復(fù)使用纤房。
{
s, z := 1000, 30 // 定義新同名變量: 不在同 層次代碼塊纵隔。
println(&s, z)
}
}
輸出結(jié)果:
0xc42003df60
0xc42003df60 20
0xc42003df58 30
Go 語(yǔ)言變量作用域
作用域?yàn)橐崖暶鳂?biāo)識(shí)符所表示的常量、類(lèi)型炮姨、變量捌刮、函數(shù)或包在源代碼中的作用范圍。
Go 語(yǔ)言中變量可以在三個(gè)地方聲明:
函數(shù)內(nèi)定義的變量稱(chēng)為局部變量
函數(shù)外定義的變量稱(chēng)為全局變量
函數(shù)定義中的變量稱(chēng)為形式參數(shù)
接下來(lái)讓我們具體了解局部變量剑令、全局變量和形式參數(shù)糊啡。
局部變量
在函數(shù)體內(nèi)聲明的變量稱(chēng)之為局部變量拄查,它們的作用域只在函數(shù)體內(nèi)吁津,參數(shù)和返回值變量也是局部變量。
以下實(shí)例中 main() 函數(shù)使用了局部變量 a, b, c:
package main
import "fmt"
func main() {
/* 聲明局部變量 */
var a, b, c int
/* 初始化參數(shù) */
a = 10
b = 20
c = a + b
fmt.Printf("結(jié)果: a = %d, b = %d and c = %d\n", a, b, c)
}
輸出結(jié)果:
結(jié)果: a = 10, b = 20 and c = 30
全局變量
在函數(shù)體外聲明的變量稱(chēng)之為全局變量,全局變量可以在整個(gè)包甚至外部包(被導(dǎo)出后)使用碍脏。
全局變量可以在任何函數(shù)中使用梭依,以下實(shí)例演示了如何使用全局變量:
package main
import "fmt"
/* 聲明全局變量 */
var g int
func main() {
/* 聲明局部變量 */
var a, b int
/* 初始化參數(shù) */
a = 10
b = 20
g = a + b
fmt.Printf("結(jié)果: a = %d, b = %d and g = %d\n", a, b, g)
}
輸出結(jié)果:
結(jié)果: a = 10, b = 20 and g = 30
Go 語(yǔ)言程序中全局變量與局部變量名稱(chēng)可以相同,但是函數(shù)內(nèi)的局部變量會(huì)被優(yōu)先考慮典尾。實(shí)例如下:
package main
import "fmt"
/* 聲明全局變量 */
var g int = 20
func main() {
/* 聲明局部變量 */
var g int = 10
fmt.Printf("結(jié)果: g = %d\n", g)
}
輸出結(jié)果:
結(jié)果: g = 10
形式參數(shù)
形式參數(shù)會(huì)作為函數(shù)的局部變量來(lái)使用役拴。實(shí)例如下:
package main
import "fmt"
/* 聲明全局變量 */
var a int = 20
func main() {
/* main 函數(shù)中聲明局部變量 */
var a int = 10
var b int = 20
var c int = 0
fmt.Printf("main()函數(shù)中 a = %d\n", a)
c = sum(a, b)
fmt.Printf("main()函數(shù)中 c = %d\n", c)
}
/* 函數(shù)定義-兩數(shù)相加 */
func sum(a, b int) int {
fmt.Printf("sum() 函數(shù)中 a = %d\n", a)
fmt.Printf("sum() 函數(shù)中 b = %d\n", b)
return a + b
}
輸出結(jié)果:
main()函數(shù)中 a = 10
sum() 函數(shù)中 a = 10
sum() 函數(shù)中 b = 20
main()函數(shù)中 c = 30
不同類(lèi)型的局部和全局變量默認(rèn)值:
全局:
package main
import "fmt"
var b bool
var i int
var i8 int8
var i16 int16
var i32 int32
var i64 int64
var ui uint
var ui8 uint8
var ui16 uint16
var ui32 uint32
var ui64 uint64
var f32 float32
var f64 float64
var s string
func main() {
fmt.Printf("全局變量: bool 默認(rèn)值:%v\n", b)
fmt.Printf("全局變量: int 默認(rèn)值:%v\n", i)
fmt.Printf("全局變量: int8 默認(rèn)值:%v\n", i8)
fmt.Printf("全局變量: int16 默認(rèn)值:%v\n", i16)
fmt.Printf("全局變量: int32 默認(rèn)值:%v\n", i32)
fmt.Printf("全局變量: int64 默認(rèn)值:%v\n", i64)
fmt.Printf("全局變量: int64 默認(rèn)值:%v\n", i64)
fmt.Printf("全局變量: uint 默認(rèn)值:%v\n", ui)
fmt.Printf("全局變量: uint8 默認(rèn)值:%v\n", ui8)
fmt.Printf("全局變量: uint16 默認(rèn)值:%v\n", ui16)
fmt.Printf("全局變量: uint32 默認(rèn)值:%v\n", ui32)
fmt.Printf("全局變量: uint64 默認(rèn)值:%v\n", ui64)
fmt.Printf("全局變量: uint64 默認(rèn)值:%v\n", ui64)
fmt.Printf("全局變量: float32 默認(rèn)值:%v\n", f32)
fmt.Printf("全局變量: float64 默認(rèn)值:%v\n", f64)
fmt.Printf("全局變量: string 默認(rèn)值:%v\n", s)
}
輸出結(jié)果:
全局變量: bool 默認(rèn)值:false
全局變量: int 默認(rèn)值:0
全局變量: int8 默認(rèn)值:0
全局變量: int16 默認(rèn)值:0
全局變量: int32 默認(rèn)值:0
全局變量: int64 默認(rèn)值:0
全局變量: int64 默認(rèn)值:0
全局變量: uint 默認(rèn)值:0
全局變量: uint8 默認(rèn)值:0
全局變量: uint16 默認(rèn)值:0
全局變量: uint32 默認(rèn)值:0
全局變量: uint64 默認(rèn)值:0
全局變量: uint64 默認(rèn)值:0
全局變量: float32 默認(rèn)值:0
全局變量: float64 默認(rèn)值:0
全局變量: string 默認(rèn)值:
局部:
package main
import "fmt"
func main() {
var b bool
var i int
var i8 int8
var i16 int16
var i32 int32
var i64 int64
var ui uint
var ui8 uint8
var ui16 uint16
var ui32 uint32
var ui64 uint64
var f32 float32
var f64 float64
var s string
fmt.Printf("局部變量: bool 默認(rèn)值:%v\n", b)
fmt.Printf("局部變量: int 默認(rèn)值:%v\n", i)
fmt.Printf("局部變量: int8 默認(rèn)值:%v\n", i8)
fmt.Printf("局部變量: int16 默認(rèn)值:%v\n", i16)
fmt.Printf("局部變量: int32 默認(rèn)值:%v\n", i32)
fmt.Printf("局部變量: int64 默認(rèn)值:%v\n", i64)
fmt.Printf("局部變量: int64 默認(rèn)值:%v\n", i64)
fmt.Printf("局部變量: uint 默認(rèn)值:%v\n", ui)
fmt.Printf("局部變量: uint8 默認(rèn)值:%v\n", ui8)
fmt.Printf("局部變量: uint16 默認(rèn)值:%v\n", ui16)
fmt.Printf("局部變量: uint32 默認(rèn)值:%v\n", ui32)
fmt.Printf("局部變量: uint64 默認(rèn)值:%v\n", ui64)
fmt.Printf("局部變量: uint64 默認(rèn)值:%v\n", ui64)
fmt.Printf("局部變量: float32 默認(rèn)值:%v\n", f32)
fmt.Printf("局部變量: float64 默認(rèn)值:%v\n", f64)
fmt.Printf("局部變量: string 默認(rèn)值:%v\n", s)
}
輸出結(jié)果:
局部變量: bool 默認(rèn)值:false
局部變量: int 默認(rèn)值:0
局部變量: int8 默認(rèn)值:0
局部變量: int16 默認(rèn)值:0
局部變量: int32 默認(rèn)值:0
局部變量: int64 默認(rèn)值:0
局部變量: int64 默認(rèn)值:0
局部變量: uint 默認(rèn)值:0
局部變量: uint8 默認(rèn)值:0
局部變量: uint16 默認(rèn)值:0
局部變量: uint32 默認(rèn)值:0
局部變量: uint64 默認(rèn)值:0
局部變量: uint64 默認(rèn)值:0
局部變量: float32 默認(rèn)值:0
局部變量: float64 默認(rèn)值:0
局部變量: string 默認(rèn)值: