您好,登錄后才能下訂單哦!
變量指定了某存儲(chǔ)單元(Memory Location)的名稱(chēng),該存儲(chǔ)單元會(huì)存儲(chǔ)特定類(lèi)型的值。在 Go 中,有多種語(yǔ)法用于聲明變量。
var name type 是聲明單個(gè)變量的語(yǔ)法。
package main
import "fmt"
func main() {
var age int // 變量聲明
fmt.Println("my age is", age)
}
語(yǔ)句 var age int
聲明了一個(gè) int 類(lèi)型的變量,名字為 age。我們還沒(méi)有給該變量賦值。如果變量未被賦值,Go 會(huì)自動(dòng)地將其初始化,賦值該變量類(lèi)型的零值(Zero Value)。本例中 age 就被賦值為 0。如果你運(yùn)行該程序,你會(huì)看到如下輸出:
my age is 0
變量可以賦值為本類(lèi)型的任何值。上一程序中的 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)
}
上面的程序會(huì)有如下輸出:
my age is 0
my age is 29
my new age is 54
聲明變量的同時(shí)可以給定初始值。 var name type = initialvalue 的語(yǔ)法用于聲明變量并初始化。
package main
import "fmt"
func main() {
var age int = 29 // 聲明變量并初始化
fmt.Println("my age is", age)
}
在上面的程序中,age 是具有初始值 29 的 int 類(lèi)型變量。如果你運(yùn)行上面的程序,你可以看見(jiàn)下面的輸出,證實(shí) age 已經(jīng)被初始化為 29。
my age is 29
如果變量有初始值,那么 Go 能夠自動(dòng)推斷具有初始值的變量的類(lèi)型。因此,如果變量有初始值,就可以在變量聲明中省略 type
。
如果變量聲明的語(yǔ)法是 var name = initialvalue,Go 能夠根據(jù)初始值自動(dòng)推斷變量的類(lèi)型。
在下面的例子中,你可以看到在第 6 行,我們省略了變量 age
的 int
類(lèi)型,Go 依然推斷出了它是 int 類(lèi)型。
package main
import "fmt"
func main() {
var age = 29 // 可以推斷類(lèi)型
fmt.Println("my age is", age)
}
Go 能夠通過(guò)一條語(yǔ)句聲明多個(gè)變量。
聲明多個(gè)變量的語(yǔ)法是 var name1, name2 type = initialvalue1, initialvalue2。
package main
import "fmt"
func main() {
var width, height int = 100, 50 // 聲明多個(gè)變量
fmt.Println("width is", width, "height is", heigh)
}
上述程序?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)
}
上面的程序?qū)?huì)打?。?/p>
width is 0 height is 0
new width is 100 new height is 50
在有些情況下,我們可能會(huì)想要在一個(gè)語(yǔ)句中聲明不同類(lèi)型的變量。其語(yǔ)法如下:
var (
name1 = initialvalue1,
name2 = initialvalue2
)
使用上述語(yǔ)法,下面的程序聲明不同類(lèi)型的變量。
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)
}
這里我們聲明了 string 類(lèi)型的 name、int 類(lèi)型的 age 和 height(我們將會(huì)在下一教程中討論 golang 所支持的變量類(lèi)型)。運(yùn)行上面的程序會(huì)產(chǎn)生輸出 my name is naveen , age is 29 and height is 0
。
Go 也支持一種聲明變量的簡(jiǎn)潔形式,稱(chēng)為簡(jiǎn)短聲明(Short Hand Declaration),該聲明使用了 := 操作符。
聲明變量的簡(jiǎn)短語(yǔ)法是 name := initialvalue。
package main
import "fmt"
func main() {
name, age := "naveen", 29 // 簡(jiǎn)短聲明
fmt.Println("my name is", name, "age is", age)
}
運(yùn)行上面的程序,可以看到輸出為 my name is naveen age is 29
。
簡(jiǎn)短聲明要求 := 操作符左邊的所有變量都有初始值。下面程序?qū)?huì)拋出錯(cuò)誤 cannot assign 1 values to 2 variables
,這是因?yàn)?age 沒(méi)有被賦值。
package main
import "fmt"
func main() {
name, age := "naveen" //error
fmt.Println("my name is", name, "age is", age)
}
簡(jiǎn)短聲明的語(yǔ)法要求 := 操作符的左邊至少有一個(gè)變量是尚未聲明的??紤]下面的程序:
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)
}
在上面程序中的第 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 // 錯(cuò)誤,沒(méi)有尚未聲明的變量
}
上面運(yùn)行后會(huì)拋出 no new variables on left side of :=
的錯(cuò)誤,這是因?yàn)?a 和 b 的變量已經(jīng)聲明過(guò)了,:= 的左邊并沒(méi)有尚未聲明的變量。
變量也可以在運(yùn)行時(shí)進(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)
}
在上面的程序中,c 的值是運(yùn)行過(guò)程中計(jì)算得到的,即 a 和 b 的最小值。上述程序會(huì)打?。?/p>
minimum value is 145.8
由于 Go 是強(qiáng)類(lèi)型(Strongly Typed)語(yǔ)言,因此不允許某一類(lèi)型的變量賦值為其他類(lèi)型的值。下面的程序會(huì)拋出錯(cuò)誤 cannot use "naveen" (type string) as type int in assignment
,這是因?yàn)?age 本來(lái)聲明為 int 類(lèi)型,而我們卻嘗試給它賦字符串類(lèi)型的值。
package main
func main() {
age := 29 // age是int類(lèi)型
age = "naveen" // 錯(cuò)誤,嘗試賦值一個(gè)字符串給int類(lèi)型變量
}
當(dāng)變量被聲明但沒(méi)有賦值時(shí),它得值就是定義時(shí)制定類(lèi)型得零值,例如 int 為 0, float為0.0,bool為 false, string為空字符串,指針為nil等
package main
import (
"fmt"
"os"
)
var (
NAME = os.Setenv("NAME", "name") // 設(shè)置環(huán)境變量
)
func main(){
fmt.Println(os.Getenv("NAME")) // 獲取環(huán)境變量
user := os.Getenv("USER")
// user為空, 因?yàn)樵诃h(huán)境變量中沒(méi)有這個(gè)變量
fmt.Println(user)
fmt.Printf("%T", user)
// 以下是運(yùn)行結(jié)果
// name
//
// string
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。