中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中的常量和變量的定義

發布時間:2021-08-27 17:03:06 來源:億速云 閱讀:148 作者:chen 欄目:數據庫

這篇文章主要介紹“Go語言中的常量和變量的定義”,在日常操作中,相信很多人在Go語言中的常量和變量的定義問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Go語言中的常量和變量的定義”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

常量(Constants)和iota

常量包含不會發生更改的數據。常量的數據類型只能是boolean、number(int/float/complex)或string。

定義方式:

const NAME [TYPE] = VALUE

TYPE基本可以省略,因為常量都是簡單數據類型,編譯器可以根據值推斷出它的數據類型。

例如:

const Pi = 3.14159

常量在編譯期間被評估,因此定義的常量必須是在編譯期間就能計算出來的結果。例如調用一些運行期間的函數來生成常量的值就是錯誤的,因為在編譯期間無法調用這些運行期間的函數。常量的值定義好后,無法在運行期間更改,否則會報錯。

const c = 3+2 // 正確 const d = getNumber() // 錯誤

常量的精度可以隨意長,Go不會出現精度溢出的問題。且常量賦值時,如果值太長,可以使用續行符\:

const Ln2= 0.693147180559945309417232121458\ 176568075500134360255254120680009 const Log2E= 1/Ln2 const Billion = 1e9

Go中只有將超出變量精度的值賦值給變量時才會出現溢出問題。

可以一次性定義多個常量:

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 )

常量可以用枚舉。定義了下面的常量后,Female就代表了數值1。

const (    Unknown = 0 Female = 1 Male = 2 )

可以使用iota實現枚舉,iota自身是builtin包中定義的一個常量,其值為0,它用于在常量中定義序列數,從0開始增加:

const (    a = iota b = iota c = iota )

當iota第一次調用時,產生數值0,在新行中再次調用iota,將自動增加1,所以上面的a=0,b=1,c=2。上面的常量枚舉可以簡寫成等價形式:

const (    a = iota b    c)

iota不能用于運行期間,因為它是小寫字母開頭的常量,不會被導出。下面的代碼會報錯:iota未定義

var a int = iota

iota也可以用于表達式中,例如iota+50表示將當前的iota值加上50。

每個常量塊(const block)結構都會重置和初始化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)}

變量

在使用變量之前,有兩個過程:聲明變量、變量賦值。聲明變量也常被稱為"定義變量"。變量聲明后必須使用,否則會報錯。

定義變量的常用方式:

var identifier type

例如:

var a int var b bool var str string // 或者 var (    a int b bool str string )

當變量聲明的時候,會做默認的賦0初始化,每種數據類型的默認賦0初始化的0值不同。例如int類型的0值為數值0,float的0值為0.0,string類型的0值為空"",bool類型的0值為false,數據結構的0值為nil,struct的0值為字段全部賦0。

變量在編譯期間就可以獲取到它的值,但如果賦值給變量的值需要經過運行期間的計算,則需要延遲到運行期間才能獲取對應的值。

var a int = 15 // 編譯期間賦值好 var b int = 15/3 // 編譯期間賦值好 var c = getNumber() // 運行期間才賦值

聲明和賦值可以結合:

var a int = 15 var i = 5 var b bool = false var str string = "Hello World"

聲明和賦值結合的時候,對于簡單數據類型的值,可以省略type部分,因為Go可以根據值自己推斷出類型:

var a = 15 var b = false var str = "Hello World" var (    a = 15 b = false str = "Hello World" numShips = 50 city string )

因為要推斷數據類型,所以類型推斷操作是在運行期間完成的。

在使用推斷類型的賦值時,如果想要指定特定類型,需要顯式指定。例如整數數值推斷的類型為int,要想讓它保存到int64中,則必須顯式指定類型:

var a int64 = 2

要推斷類型必須是聲明和賦值一起的,否則沒有值,無法根據值去推斷。例如var a是錯的。

除了上面的推斷方式,通過:=符號也能實現聲明和賦值結合,它也會根據數據類型進行推斷,連var關鍵字都省略了:

a := 50

但是:=只能在函數代碼塊內部使用,在全局作用域下使用將報錯,因為類型推斷是在運行期執行的,而全局范圍內的變量聲明部分是在編譯期間就決定好的。例如,下面的將報錯:

12a := 10 func main() { println(a) }

變量聲明之后不能再次聲明(除非在不同的作用域),之后只能使用=進行賦值。例如,執行下面的代碼將報錯:

package main import ("fmt") func main(){ x:=10 fmt.Println("x =",x)    x:=11 fmt.Println("x =",x)}

錯誤如下:

12# command-line-arguments .\test.go:8:3: no new variables on left side of :=

報錯信息很明顯,:=左邊沒有新變量。

如果仔細看上面的報錯信息,會發現no new variables是一個復數。實際上,Go允許我們使用:=一次性聲明、賦值多個變量,而且只要左邊有任何一個新變量,語法就是正確的。

func main(){    name,age := "longshuai",23 fmt.Println("name:",name,"age:",age) // name重新賦值,因為有一個新變量weight weight,name := 90,"malongshuai" fmt.Println("name:",name,"weight:",weight)}

需要注意,name第二次被:=賦值,Go第一次推斷出該變量的數據類型之后,就不允許:=再改變它的數據類型,因為只有第一次:=對name進行聲明,之后所有的:=對name都只是簡單的賦值操作。

例如,下面將報錯:

weight,name := 90,80

錯誤信息:

.\test.go:11:14: cannot use 80 (type int) as type string in assignment

另外,變量聲明之后必須使用,否則會報錯,因為Go對規范的要求非常嚴格。例如,下面定義了weight但卻沒使用:

12weight,name := 90,"malongshuai" fmt.Println("name:",name)

錯誤信息:

.\test.go:11:2: weight declared and not used

變量作用域(scope)

Go語言的作用域采用的是詞法作用域,意味著文本段定義所在位置決定了可看見的值范圍。

  • 定義在函數內部的變量為局部變量,只在函數內部可見定義在代碼塊內(如{...CODE...})的變量也是局部變量,除了代碼塊就消失定義在代碼塊外、函數外的變量為包變量或者全局變量,它們可以被同一個目錄下同一個包的多個文件訪問(因為Go中一個目錄下只能定義一個包,但一個包可以分成多個文件)如果變量的名稱以小寫字母開頭,則其它包不能訪問該變量如果變量的名稱以大寫字母開頭,則其它包可以訪問該變量

  • 不同scope的變量名可以沖突,但建議采取名稱唯一的方式為變量命名。


到此,關于“Go語言中的常量和變量的定義”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蒙自县| 湘乡市| 沾化县| 甘泉县| 隆昌县| 沙洋县| 南和县| 东莞市| 南开区| 广昌县| 阳春市| 页游| 调兵山市| 宁陵县| 安岳县| 股票| 江城| 手游| 哈巴河县| 平定县| 镇赉县| 辰溪县| 寻乌县| 宣城市| 吴桥县| 瓮安县| 武城县| 陵川县| 新津县| 河曲县| 烟台市| 阿瓦提县| 河南省| 大港区| 上犹县| 嘉义市| 武鸣县| 乌鲁木齐县| 济宁市| 桃园市| 东丰县|