Go語言中的變量和常量
1 變量
變量相當于是對一塊數(shù)據(jù)存儲空間的命名,程序可以通過定義一個變量來申請一塊數(shù)據(jù)存儲空間,之后可以通過引用變量名來使用這塊存儲空間。
Go 語言是強類型靜態(tài)語言,所以變量的聲明與賦值方式與 PHP/Python 等動態(tài)語言相比有很大的區(qū)別。
-
動態(tài)語言(弱類型語言)是運行時才確定數(shù)據(jù)類型的語言,變量在使用之前無需申明類型,通常變量的值是被賦值的那個值的類型。比如Php、Asp、JavaScript、Python、Perl等等。
-
靜態(tài)語言(強類型語言)是編譯時變量的數(shù)據(jù)類型就可以確定的語言,大多數(shù)靜態(tài)語言要求在使用變量之前必須生命數(shù)據(jù)類型。比如Java、C、C++、C#等。
1.1 變量聲明和規(guī)則
Go 語言引入了關鍵字 var,并且將數(shù)據(jù)類型信息放在變量名之后,此外,變量聲明語句不需要使用分號作為結束符,例如聲明一個類型為 int 的變量 v1,示例如下:
var v1 int
// 也可以將若干需要聲明的變量放置在一起
var (
? ?v1 int
? ?v2 string
)
Go 語言支持多種數(shù)據(jù)類型,這里先簡單展示一下
var v1 int // 整型
var v2 string // 字符串
var v3 bool // 布爾類型
var v4 [10]int // 數(shù)組,數(shù)組元素類型為整型
var v5 struct ( // 結構體,成員變量 f 的類型為64位浮點型號
? ?f float64
)
var v6 *int // 指針,指向整型
var v7 map[string]int // map(字典),key為字符串類型,value為整型
var v8 func(a int) int // 函數(shù),參數(shù)類型為整型,返回類型為整型
變量在聲明之后,系統(tǒng)會自動將變量值初始化為對應類型的零值,這里輸出一下上面定義的變量。
如果變量名包含多個單詞,Go 語言變量命名規(guī)則遵循駝峰命名法,即首個單詞小寫,每個新單詞的首字母大寫,如 userName
,但如果你的全局變量希望能夠被外部包所使用,則需要將首個單詞的首字母也大寫。
1.2 變量初始化
如果聲明變量時想要同時對變量值進行初始化,可以通過以下這些方式:
var v1 int = 10 // 方式一,常規(guī)的初始化操作
var v2 = 10 ? ? // 方式二,此時變量類型會被編譯器自動推導出來
v3 := 10 ? ? ? ?// 方式三,可以省略 var,編譯器可以自動推導出v3的類型
代碼測試如下:
這里注意Go語言變量聲明使用的符號是:=
,而不是=
。
變量進行初始化時,可以不必指定數(shù)據(jù)類型,這里讓Go看上像是靜態(tài)類型語言,但是與 PHP/Python/JavaScript 等動態(tài)語言不同的是,這個推導是在編譯期做的,而不是運行時,因此 Go 語言還是不折不扣的靜態(tài)語言。
另外,出現(xiàn)在 :=
運算符左側的變量應該是未聲明過的,否則會導致編譯錯誤,比如下面這個寫法:
var i int
i := 2
會出現(xiàn)如下的報錯
1.3 變量賦值與多重賦值
在 Go 語言中,變量初始化和變量賦值是兩個不同的概念,變量初始化及變量聲明和賦值為一條語句,變量賦值則是先聲明變量,再對其進行賦值,初始化只能執(zhí)行一次,賦值則可以執(zhí)行多次,下面是變量賦值過程:
// 變量賦值
var v10 int
v10 = 123
// 多重賦值
i,j = j,i
代碼測試:
1.4 匿名變量
我們在使用傳統(tǒng)的強類型語言編程時,經(jīng)常會出現(xiàn)這種情況,即在調(diào)用函數(shù)時為了獲取一個值,卻因為該函數(shù)返回多個值而不得不定義一堆沒用的變量。
匿名變量語法:
func GetName() (userName, nickName string) {
return "南歌", "EuanSu"
}
?
func AnonymousVariables() {
// 匿名變量
// GetName返回兩個值,分別是username和nickName,
// 其中nickName是string類型,而GetName()函數(shù)中沒有使用nickName,
// 此時nickName就是一個匿名變量,它不占用命名空間,不會分配內(nèi)存,
// 因此不會產(chǎn)生任何開銷。
_, nickName := GetName()
fmt.Printf("nickName value is %s\n", nickName)
}
1.5 變量的作用域
每個變量在程序中都有一定的作用范圍,稱之為作用域。如果一個變量在函數(shù)體外聲明,則被認為是全局變量,可以在整個包甚至外部包(變量名以大寫字母開頭)使用,不管你聲明在哪個源文件里或在哪個源文件里調(diào)用該變量。在函數(shù)體內(nèi)聲明的變量稱之為局部變量,它們的作用域只在函數(shù)體內(nèi),函數(shù)的參數(shù)和返回值變量也是局部變量。
盡管變量的標識符必須是唯一的,但你可以在某個代碼塊的內(nèi)層代碼塊中使用相同名稱的變量,此時外部的同名變量將會暫時隱藏(結束內(nèi)部代碼塊的執(zhí)行后隱藏的外部同名變量又會出現(xiàn),而內(nèi)部同名變量則被釋放),任何的操作都只會影響內(nèi)部代碼塊的局部變量。
2 常量
在 Go 語言中,常量是指編譯期間就已知且不可改變的值,常量只可以是數(shù)值類型(包括整型、 浮點型和復數(shù)類型)、布爾類型、字符串類型等標量類型。Go 語言中,我們可以通過 const
關鍵字來定義常量(遵循 C 語言的約定)。
2.1 常量的定義
通過 const
關鍵字定義常量時,可以指定常量類型,也可以省略(編譯時會自動推導),常見的常量定義方式如下:
const Pi float64 = 3.14159265358979323846
const zero = 0.0 // 無類型浮點常量
const ( ? ? ? ? ?// 通過一個 const 關鍵字定義多個常量,和 var 類似
? ?size int64 = 1024
? ?eof = -1 ?// 無類型整型常量
)
const u, v float32 = 0, 3 ?// u = 0.0, v = 3.0,常量的多重賦值
const a, b, c = 3, 4, "foo" // a = 3, b = 4, c = "foo", 無類型整型和字符串常量
代碼執(zhí)行測試:
由于常量的賦值是編譯時期執(zhí)行的,因此賦值的操作中不能出現(xiàn)任何需要運行才能得到結果的函數(shù),例如如下語句就會導致編譯錯誤:
func GetNumber() int {
? ?return 100
}
const num = GetNumber()
2.2 預定義常量
GO語言預定義了常量:true、false 和 iota。
iota 比較特殊,認為是一個能夠被編譯器修改的常量,每一個 const 關鍵字出現(xiàn)時被重置為 0,每出現(xiàn)一次 iota,其所代表的數(shù)字就會自動加1.
const ( ? ?// iota 被重置為 0
? ?c0 = iota ? // c0 = 0
? ?c1 = iota ? // c1 = 1
? ?c2 = iota ? // c2 = 2
)
const (
? ?u = iota * 2; ?// u = 0
? ?v = iota * 2; ?// v = 2
? ?w = iota * 2; ?// w = 4
)
const x = iota; ?// x = 0
const y = iota; ?// y = 0
代碼運行測試:
如果兩個 const
的賦值語句的表達式是一樣的,那么還可以省略后一個賦值表達式。因此,上面的前兩個 const
語句可簡寫為:
const (
? ?c0 = iota
? ?c1
? ?c2
)
const (
? ?u = iota * 2
? ?v
? ?w
)
代碼運行測試:
2.3 枚舉
此外,常量還可以用于枚舉。
枚舉中包含了一系列相關的常量,比如下面關于一個星期中每天的定義。Go 語言并不支持其他語言用于表示枚舉的 enum
關鍵字,而是通過在 const
后跟一對圓括號定義一組常量的方式來實現(xiàn)枚舉。
下面是一個常規(guī)的 Go 語言枚舉表示法,其中定義了一系列整型常量:
const (
? ?Sunday = iota
? ?Monday
? ?Tuesday
? ?Wednesday
? ?Thursday
? ?Friday
? ?Saturday
? ?numberOfDays
)
代碼運行測試:
2.4 常量的作用域
和函數(shù)體外聲明的變量一樣,以大寫字母開頭的常量在包外可見(類似于 public
修飾的類屬性),比如上面介紹的 Pi
、Sunday
等,而以小寫字母開頭的常量只能在包內(nèi)訪問(類似于通過 protected
修飾的類屬性),比如 zero
、numberOfDays
等。文章來源:http://www.zghlxwxcb.cn/news/detail-833616.html
函數(shù)體內(nèi)聲明的常量只能在函數(shù)體內(nèi)生效。文章來源地址http://www.zghlxwxcb.cn/news/detail-833616.html
到了這里,關于【Go語言】Go語言中的變量和常量的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!