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