go基礎-資料型別二
阿新 • • 發佈:2022-04-06
資料型別
概覽
基本資料型別
- 布林型別:bool
- 整型:int8、byte、int16、int、uint、uintptr 等
- 浮點型別:float32、float64
- 複數型別:complex64、complex128
- 字串:string
- 字元型別:rune
- 錯誤型別:error
複合型別
- 指標(pointer)
- 陣列(array)
- 切片(slice)
- 字典(map)
- 通道(chan)
- 結構體(struct)
- 介面(interface)
複合資料型別
陣列
var a [8]byte // 長度為8的陣列,每個元素為一個位元組 var b [3][3]int // 二維陣列(9宮格) var c [3][3][3]float64 // 三維陣列(立體的9宮格) var d = [3]int{1, 2, 3} // 宣告時初始化 var e = new([3]string) // 通過 new 初始化 a := [5]int{1,2,3,4,5} a := [...]int{1, 2, 3} // 省略長度宣告 a := [5]int{1, 2, 3} // 初始化的時候長度是5,而填充了3個數據,那麼剩餘的兩位會用0填充 [1 2 3 0 0] a := [5]int{1: 3, 3: 7} // 指定下標位置的元素值 [0 3 0 7 0]
陣列長度在聲明後就不可更改
陣列的長度在定義之後無法修改,陣列長度是陣列型別本身的一部分,是陣列的一個內建常量,因此我們無法在陣列上做動態的元素增刪操作。
陣列元素的訪問和設定
arr := [5]int{1,2,3,4,5}
a1, a2 := arr[0], arr[len(arr) - 1] // a1=1 a2=5
arr[0] = 10 // 設定陣列第一個元素的值為10 [10 2 3 4 5]
切片
var slice []string = []string{"a", "b", "c"} // 宣告一個切片 // 基於陣列建立一個切片 months := [...]string{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} // 定義一個月份的陣列 q2 := months[3:6] // 第二季度 [April May June] summer := months[5:8] // 夏季 [June July August] all := months[:] // 全年資料 firsthalf := months[:6] // 上半年 secondhalf := months[6:] // 下半年
切片底層引用了一個數組,由三個部分構成 —— 指標、長度和容量,指標指向陣列起始下標,長度對應切片中元素的個數,容量則是切片起始位置到底層陣列結尾的位置,切片長度不能超過容量
len(q2) // 獲取切片長度
cap(q2) // 獲取切片容量
// 切片長度不能超過容量
// 直接建立一個切片
mySlice1 := make([]int, 5, 10) // 初始長度為5的整型,容量為10的切片
mySlice3 := []int{1, 2, 3, 4, 5} // 這種方式建立的,長度和容量都是5
字典map
// map 字典型別 string 字典鍵的型別 int 字典值的型別 var testMap map[string]int testMap := map[string]int{ "one": 1, "two": 2, "three": 3, } // 像切片那樣用make建立,第二個引數100是初始容量,超出會自動擴容 var testMap = make(map[string]int, 100) // 注意,用make初始化後,只能像下邊這樣進行賦值 testMap["one"] = 1 testMap["two"] = 2
指標型別
變數的本質對一塊記憶體空間的命名,我們可以通過引用變數名來使用這塊記憶體空間儲存的值,而指標則是用來指向這些變數值所在記憶體地址的值。
var ptr *int // 宣告指標型別, 指標的預設值是<nil>
a := 100
ptr = &a // 初始化指標型別值為變數 a 這時ptr列印的時候應該是記憶體地址的值
fmt.Println(ptr) // 0x1400011a008
fmt.Println(*ptr) // 100
b := 200
ptr1 := &b
fmt.Println(ptr1) // 0x1400001e060
*ptr1 = 100
fmt.Println(*ptr1) // 100
fmt.Println(b) // 100
指標型別轉化
i := 10
var p *int = &i
var fp *float32 = (*float32)(unsafe.Pointer(p))
*fp = *fp * 10
fmt.Println(i) // 100