Golang——变量和常量详解
變量:
變量是在程序運(yùn)行過程中,其值可以發(fā)生改變的量,是數(shù)據(jù)的存儲(chǔ)空間,作為靜態(tài)類型語言,Go變量有固定的數(shù)據(jù)類型,類型決定了變量內(nèi)存的長度和存儲(chǔ)格式。我們只能修改變量值,無法改變類型。
變量名:
因?yàn)閮?nèi)存分配發(fā)生在運(yùn)行期,所以在編碼階段我們用一個(gè)易于閱讀的名字來表示這段內(nèi)存,稱為變量名。 實(shí)際上編譯后的機(jī)器碼從不使用變量名,而是通過內(nèi)存地址來訪問目標(biāo)數(shù)據(jù)。
變量語法的注意事項(xiàng):
- 變量語句等號(hào)右邊的變量代表指向的內(nèi)存空間,代表寫的操作
- 變量語句等號(hào)左邊的變量代表變量內(nèi)存空間存儲(chǔ)的數(shù)據(jù)值,代表讀的操作
- 變量的首字母大寫才可以被其它的類、方法使用
- 在go里局部變量定義后就要使用,否則編譯器報(bào)錯(cuò)
變量的定義:
關(guān)鍵字var用于定義變量,數(shù)據(jù)類型被放在變量名后。另外,運(yùn)行時(shí)內(nèi)存分配操作會(huì)確保變量自動(dòng)初始化為二進(jìn)制零值(zero value),避免出現(xiàn)不可預(yù)測行為。如果是顯式初始化變量,可省略變量類型,由編譯器推斷。
x int // 定義x 沒初始化 默認(rèn)值0y = 1 // 定義y 有初始化 數(shù)據(jù)類型intvar z bool // 定義z 沒初始化 默認(rèn)值為false可以一次性定義多個(gè)變量:
var x, y int // 多個(gè)變量相同數(shù)據(jù)類型var n, m = 100, "呵呵" // 多個(gè)變量不同數(shù)據(jù)類型多個(gè)變量以組的方式定義:
var (x, y intn, m = 100, "呵呵")自動(dòng)推導(dǎo)類型:
在給變量賦值時(shí),可以簡化書寫,使用:代替var即可,會(huì)自動(dòng)檢測是什么類型。
自動(dòng)推導(dǎo)類型的弊端:
- 定義變量同時(shí)要初始化
- 不能自定義數(shù)據(jù)類型
- 自動(dòng)推導(dǎo)類型創(chuàng)建的變量是局部變量
自動(dòng)推導(dǎo)類型不一定是重新定義變量,也可能是重新賦值操作
func test() {x := 100println(&x)x, y := 200, "abc" //注意,x為賦值操作 僅有y是新變量定義println(&x, x)println(y) }打印結(jié)果:
0x14000096f60 0x14000096f60 200 abc自動(dòng)推導(dǎo)類型定義的不是全局變量,是局部變量
var num = 100func test() {fmt.Println(&num,num)num := "我被重新賦值了,我和外面的num不一樣"fmt.Println(&num,num) }打印結(jié)果:
0x1042b4288 100 0x14000110210 看看我是不是全局變量定義變量必須是同一作用域內(nèi),且是新的變量
func test2() {x := 1 // 0x14000120008fmt.Println(&x)x := 2 // 報(bào)錯(cuò):等號(hào)左邊不是新的變量{x := 3 // 不同作用域都是新的變量fmt.Println(&x) // 0x1400001a098} }在處理函數(shù)錯(cuò)誤返回值時(shí),自動(dòng)推導(dǎo)類型允許我們重復(fù)使用err變量
func test5() {f, err := os.Open("/Users/itzhuzhu/Desktop/goCode/go_basics")if err != nil {fmt.Println("os.Open err:", err)return}fmt.Println(&err)buf := make([]byte, 1024)n, err := f.Read(buf)if err != nil {fmt.Println("os.Open err:", err)return}fmt.Println(n)fmt.Println(&err) }打印結(jié)果:
0x14000110210 26 0x14000110210多變量賦值:
在進(jìn)行多變量賦值操作時(shí),首先計(jì)算出所有右值,然后依次完成賦值操作,但必須保證左右值的數(shù)據(jù)類型相同
func test6() {x, y := 1, 2 // x:1 y:2x, y = y+3, x+2 // 先計(jì)算出右值y+3、x+2,然后再對x、y變量賦值。fmt.Println(y) }局部變量&全局變量:
- 定義函數(shù)內(nèi)部的變量稱為局部變量,局部變量的作用域在函數(shù)的內(nèi)部
- 定義函數(shù)外部的變量稱為全局變量,全局變量的是任何函數(shù)都可以使用
- 如果全局變量和局部變量的名字相同,在函數(shù)內(nèi)局部變量的優(yōu)先級(jí)大于全局變量,采用就近原則
命名規(guī)則:
優(yōu)先選用有實(shí)際含義,易于閱讀和理解的字母、單詞或組合對變量、常量、函數(shù)、 自定義類型進(jìn)行命名。
- 以字母或下劃線開始,由多個(gè)字母、數(shù)字和下劃線組合而成,區(qū)分大小寫
- 使用駝峰式命名,名字首字母大小寫決定了其作用域,首字母大寫為導(dǎo)出成員,可被包外部引用,而小寫則僅能在包內(nèi)使用。這一點(diǎn)類似于Java的修飾符public和private
- 局部變量優(yōu)先使用短命名
- 專有名詞通常會(huì)全部大寫,例如escapeHTML
忽略占位符:
Go有個(gè)名為的特殊成員(Black Identifier)。通常作為忽略占位符使用,可作表達(dá)式左值,無法讀取其內(nèi)容。使用_表示
空標(biāo)識(shí)符可用來臨時(shí)規(guī)避編譯器對未使用變量和導(dǎo)入包的錯(cuò)誤檢查,但它是預(yù)置成員,不能重新定義
import ("fmt"_"os" // 對于還沒用到且不想刪除的可以加上占位符,避免編譯報(bào)錯(cuò) ) _, err = conn.Write([]byte(fileName)) // _:表示忽略占位符if err != nil {fmt.Println("conn.Write err:", err)return }常量:
常量是在程序運(yùn)行過程中,其值不可以發(fā)生改變的量。常量的定義是通過const關(guān)鍵字完成的,并且常量名稱要大寫
常量值必須是編譯期可確定的字符、字符串、數(shù)字或布爾值。可指定常量類型或由編譯 器通過初始化值推斷
定義常量不使用不會(huì)編譯錯(cuò)誤,不同作用域也可以定義相同常量
func test8() {const x = 123fmt.Println("我是外面的:", x)const y = 1.23 // 未使用不會(huì)引發(fā)編譯錯(cuò)誤{const x = 321 // 不同作用域定義同名變量fmt.Println("我是里面的:", x)} }如果顯式指定數(shù)據(jù)類型,必須確保常量左右值類型一致,需要時(shí)可做顯式轉(zhuǎn)換。右值不能超出常量類型取值范圍,否則會(huì)引發(fā)溢出錯(cuò)誤
func test09() {const (x, y int = 99, -999b = byte(x) // 如果x沒有顯式類型定義,那么無需轉(zhuǎn)換n = uint8(y) // 報(bào)錯(cuò):無法將類型 'int' 的表達(dá)式轉(zhuǎn)換為類型 'uint8') }常量值也可以是某些編譯器能直接計(jì)算結(jié)果的表達(dá)式,如unsafe.Sizeof、len、cap等
func test10() {const (ptrSize = unsafe.Sizeof(uintptr(0))strSize = len("hello, world!"))fmt.Println(ptrSize)fmt.Println(strSize) }在常量組中如不指定類型和初始化值,則與上一行非空常量右值(或表達(dá)式文本)相同。
func test11() {const (x uint16 = 120y // 與上一行x類型、右值相同s = "abc"z // 與s類型、右值相同)fmt.Printf("%T, %v\n", y, y) // 輸出類型和值fmt.Printf("%T, %v\n", z, z) }打印結(jié)果:
uint16, 120 string, abc顯示常量和隱式定義常量區(qū)別:
const x = 100 // 隱式無常量類型 const y byte = x // 相當(dāng)于const y byte = 100 const a int = 100 // 顯式指定常量類型,編譯器會(huì)做強(qiáng)類型検查 const b byte = a // 錯(cuò)誤:cannot use a (type int) as type byte in const initializer變量和常量的區(qū)別:
常量除不可以再次賦值外,和變量究竟有什么不同?
常量不會(huì)分配存儲(chǔ)空間,無需像變量那樣通過內(nèi)存尋址來取值,因此無法獲取地址。
常量值不能再次改變,變量可以
關(guān)鍵字:
Go中有25個(gè)關(guān)鍵字,雖不是主流語言中最少的,但也體現(xiàn)了Go語法規(guī)則的簡潔性。關(guān)鍵字不能用作常量、變量、有數(shù)名以及結(jié)構(gòu)字段等標(biāo)識(shí)符。
| break | default | func | interface | select |
| case | defer | go | map | struct |
| chan | else | goto | package | switch |
| const | fallthrough | if | range | type |
| continue | for | import | return | var |
初始化:
對復(fù)合類型(array、slice、struct、map)變量初始化時(shí),有一些語法限制
- 初始化表達(dá)式必須有類型標(biāo)簽
- 左大括號(hào)必須在類型尾部,不能另起一行
- 多個(gè)成員初始值以逗號(hào)分隔
- 允許多行,但每行必須以逗號(hào)或右大括號(hào)結(jié)束
總結(jié)
以上是生活随笔為你收集整理的Golang——变量和常量详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工业机器人专业展板图片_南充职业技术学院
- 下一篇: 用c语言随机获区100个整数,用rand