共計(jì) 3404 個(gè)字符,預(yù)計(jì)需要花費(fèi) 9 分鐘才能閱讀完成。
這篇文章主要介紹“Go 語言中的常量和變量的定義”,在日常操作中,相信很多人在 Go 語言中的常量和變量的定義問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Go 語言中的常量和變量的定義”的疑惑有所幫助!接下來,請(qǐng)跟著丸趣 TV 小編一起來學(xué)習(xí)吧!
常量 (Constants) 和 iota
常量包含不會(huì)發(fā)生更改的數(shù)據(jù)。常量的數(shù)據(jù)類型只能是 boolean、number(int/float/complex)或 string。
定義方式:
const NAME [TYPE] = VALUE
TYPE 基本可以省略,因?yàn)槌A慷际呛?jiǎn)單數(shù)據(jù)類型,編譯器可以根據(jù)值推斷出它的數(shù)據(jù)類型。
例如:
const Pi = 3.14159
常量在編譯期間被評(píng)估,因此定義的常量必須是在編譯期間就能計(jì)算出來的結(jié)果。例如調(diào)用一些運(yùn)行期間的函數(shù)來生成常量的值就是錯(cuò)誤的,因?yàn)樵诰幾g期間無法調(diào)用這些運(yùn)行期間的函數(shù)。常量的值定義好后,無法在運(yùn)行期間更改,否則會(huì)報(bào)錯(cuò)。
const c = 3+2 // 正確 const d = getNumber() // 錯(cuò)誤
常量的精度可以隨意長(zhǎng),Go 不會(huì)出現(xiàn)精度溢出的問題。且常量賦值時(shí),如果值太長(zhǎng),可以使用續(xù)行符 \:
const Ln2= 0.693147180559945309417232121458\ 176568075500134360255254120680009 const Log2E= 1/Ln2 const Billion = 1e9
Go 中只有將超出變量精度的值賦值給變量時(shí)才會(huì)出現(xiàn)溢出問題。
可以一次性定義多個(gè)常量:
const beef, two, c = meat , 2, veg const Monday, Tuesday, Wednesday = 1, 2, 3 const ( Monday, Tuesday, Wednesday = 1, 2, 3 Thursday, Friday, Saturday = 4, 5, 6)
常量可以用枚舉。定義了下面的常量后,F(xiàn)emale 就代表了數(shù)值 1。
const ( Unknown = 0 Female = 1 Male = 2)
可以使用 iota 實(shí)現(xiàn)枚舉,iota 自身是 builtin 包中定義的一個(gè)常量,其值為 0,它用于在常量中定義序列數(shù),從 0 開始增加:
const ( a = iota b = iota c = iota)
當(dāng) iota 第一次調(diào)用時(shí),產(chǎn)生數(shù)值 0,在新行中再次調(diào)用 iota,將自動(dòng)增加 1,所以上面的 a =0,b=1,c=2。上面的常量枚舉可以簡(jiǎn)寫成等價(jià)形式:
const ( a = iota b c)
iota 不能用于運(yùn)行期間,因?yàn)樗切懽帜搁_頭的常量,不會(huì)被導(dǎo)出。下面的代碼會(huì)報(bào)錯(cuò):iota 未定義
var a int = iota
iota 也可以用于表達(dá)式中,例如 iota+50 表示將當(dāng)前的 iota 值加上 50。
每個(gè)常量塊 (const block) 結(jié)構(gòu)都會(huì)重置和初始化 iota 的值為 0。
func main() { const a = iota // a=0 const b = iota + 3 // b=3 const c,d = iota,iota+3 // c=0,d=3 const ( e = iota // e=0 f = iota + 4 // f=5 g // g=6) println(a,b,c,d,e,f,g)}
變量
在使用變量之前,有兩個(gè)過程:聲明變量、變量賦值。聲明變量也常被稱為 定義變量。變量聲明后必須使用,否則會(huì)報(bào)錯(cuò)。
定義變量的常用方式:
var identifier type
例如:
var a int var b bool var str string // 或者 var ( a int b bool str string)
當(dāng)變量聲明的時(shí)候,會(huì)做默認(rèn)的賦 0 初始化,每種數(shù)據(jù)類型的默認(rèn)賦 0 初始化的 0 值不同。例如 int 類型的 0 值為數(shù)值 0,float 的 0 值為 0.0,string 類型的 0 值為空,bool 類型的 0 值為 false,數(shù)據(jù)結(jié)構(gòu)的 0 值為 nil,struct 的 0 值為字段全部賦 0。
變量在編譯期間就可以獲取到它的值,但如果賦值給變量的值需要經(jīng)過運(yùn)行期間的計(jì)算,則需要延遲到運(yùn)行期間才能獲取對(duì)應(yīng)的值。
var a int = 15 // 編譯期間賦值好 var b int = 15/3 // 編譯期間賦值好 var c = getNumber() // 運(yùn)行期間才賦值
聲明和賦值可以結(jié)合:
var a int = 15 var i = 5 var b bool = false var str string = Hello World
聲明和賦值結(jié)合的時(shí)候,對(duì)于簡(jiǎn)單數(shù)據(jù)類型的值,可以省略 type 部分,因?yàn)?Go 可以根據(jù)值自己推斷出類型:
var a = 15 var b = false var str = Hello World var ( a = 15 b = false str = Hello World numShips = 50 city string)
因?yàn)橐茢鄶?shù)據(jù)類型,所以類型推斷操作是在運(yùn)行期間完成的。
在使用推斷類型的賦值時(shí),如果想要指定特定類型,需要顯式指定。例如整數(shù)數(shù)值推斷的類型為 int,要想讓它保存到 int64 中,則必須顯式指定類型:
var a int64 = 2
要推斷類型必須是聲明和賦值一起的,否則沒有值,無法根據(jù)值去推斷。例如 var a 是錯(cuò)的。
除了上面的推斷方式,通過:= 符號(hào)也能實(shí)現(xiàn)聲明和賦值結(jié)合,它也會(huì)根據(jù)數(shù)據(jù)類型進(jìn)行推斷,連 var 關(guān)鍵字都省略了:
a := 50
但是:= 只能在函數(shù)代碼塊內(nèi)部使用,在全局作用域下使用將報(bào)錯(cuò),因?yàn)轭愋屯茢嗍窃谶\(yùn)行期執(zhí)行的,而全局范圍內(nèi)的變量聲明部分是在編譯期間就決定好的。例如,下面的將報(bào)錯(cuò):
12a := 10 func main() { println(a) }
變量聲明之后不能再次聲明(除非在不同的作用域),之后只能使用 = 進(jìn)行賦值。例如,執(zhí)行下面的代碼將報(bào)錯(cuò):
package main import (fmt) func main(){ x:=10 fmt.Println( x = ,x) x:=11 fmt.Println(x = ,x)}
錯(cuò)誤如下:
12# command-line-arguments .\test.go:8:3: no new variables on left side of :=
報(bào)錯(cuò)信息很明顯,:= 左邊沒有新變量。
如果仔細(xì)看上面的報(bào)錯(cuò)信息,會(huì)發(fā)現(xiàn) no new variables 是一個(gè)復(fù)數(shù)。實(shí)際上,Go 允許我們使用:= 一次性聲明、賦值多個(gè)變量,而且只要左邊有任何一個(gè)新變量,語法就是正確的。
func main(){ name,age := longshuai ,23 fmt.Println( name: ,name, age: ,age) // name 重新賦值,因?yàn)橛幸粋€(gè)新變量 weight weight,name := 90, malongshuai fmt.Println(name: ,name, weight: ,weight)}
需要注意,name 第二次被:= 賦值,Go 第一次推斷出該變量的數(shù)據(jù)類型之后,就不允許:= 再改變它的數(shù)據(jù)類型,因?yàn)橹挥械谝淮?= 對(duì) name 進(jìn)行聲明,之后所有的:= 對(duì) name 都只是簡(jiǎn)單的賦值操作。
例如,下面將報(bào)錯(cuò):
weight,name := 90,80
錯(cuò)誤信息:
.\test.go:11:14: cannot use 80 (type int) as type string in assignment
另外,變量聲明之后必須使用,否則會(huì)報(bào)錯(cuò),因?yàn)?Go 對(duì)規(guī)范的要求非常嚴(yán)格。例如,下面定義了 weight 但卻沒使用:
12weight,name := 90, malongshuai fmt.Println(name: ,name)
錯(cuò)誤信息:
.\test.go:11:2: weight declared and not used
變量作用域(scope)
Go 語言的作用域采用的是詞法作用域,意味著文本段定義所在位置決定了可看見的值范圍。
定義在函數(shù)內(nèi)部的變量為局部變量,只在函數(shù)內(nèi)部可見定義在代碼塊內(nèi) (如{…CODE…}) 的變量也是局部變量,除了代碼塊就消失定義在代碼塊外、函數(shù)外的變量為包變量或者全局變量,它們可以被同一個(gè)目錄下同一個(gè)包的多個(gè)文件訪問 (因?yàn)?Go 中一個(gè)目錄下只能定義一個(gè)包,但一個(gè)包可以分成多個(gè)文件) 如果變量的名稱以小寫字母開頭,則其它包不能訪問該變量如果變量的名稱以大寫字母開頭,則其它包可以訪問該變量
不同 scope 的變量名可以沖突,但建議采取名稱唯一的方式為變量命名。
到此,關(guān)于“Go 語言中的常量和變量的定義”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!