數組是具有相同唯一類型的一組已編號且長度固定的數據項序列,這種類型可以是任意的原始類型例如整形、字符串或者自定義類型
package main
import (
"fmt"
"reflect"
)
func main() {
/*
數組聲明
*/
// 數組聲明格式 TypeOf輸出變量類型
// 結果輸出:[10]int
var tArray [10] int
fmt.Println(reflect.TypeOf(tArray))
// 不指定數組元素長度 讓編譯器自己識別
// 結果輸出:[3]int
var tArray2 = [...]int{1, 2, 3}
fmt.Println(reflect.TypeOf(tArray2))
/*
數組訪問
*/
// 根據下標讀取元素 初始下標爲0 也就是偏移量 偏移量爲0 所以讀的是第一個元素
// tArray只聲明 沒賦值 根據默認賦值規則 輸出:0
fmt.Println(tArray[0])
// 輸出tArray2第一個元素 1
fmt.Println(tArray2[0])
// 訪問不存在的元素 編譯錯誤 數組越界
//fmt.Println(tArray2[3])
/*
多維數組
*/
// go語言支持多維數組 以二維數組爲例
// 聲明
var tArray3 [2][2] int
// 初始化 輸出:[[1 2] [3 4]]
tArray3 = [2][2] int{{1, 2}, {3, 4}}
fmt.Println(tArray3)
// 根據下標訪問 輸出:1
fmt.Println(tArray3[0][0])
}
切片是對數組的抽象 Go 數組的長度不可改變,在特定場景中這樣的集合就不太適用,Go中提供了一種靈活,功能強悍的內置類型切片(動態數組)
package main
import (
"fmt"
"reflect"
)
func main() {
// 切片聲明 未指定大小的數組就是切片 未賦值的切片值爲nil
var tSlice []int
// 輸出[]int
fmt.Println(reflect.TypeOf(tSlice))
// 使用make函數來創建切片
var tSlice1 []int = make([]int, 10)
// 輸出[]int
fmt.Println(reflect.TypeOf(tSlice1))
// 簡寫 直接賦值
tSlice2 := make([]int, 10)
tSlice3 := []int{1, 2, 3}
// 輸出[]int
fmt.Println(reflect.TypeOf(tSlice2))
// 輸出[]int
fmt.Println(reflect.TypeOf(tSlice3))
// 直接從數組中創建切片 s := arr[startIndex:endIndex]
// 根據下標切割數組 左下標默認爲起始 右下標默認爲最後一個
tArray := [5]int{1, 2, 3, 4, 5}
tSlice4 := tArray[0:2]
tSlice5 := tArray[0:]
// 輸出:[1,2]
fmt.Println(tSlice4)
// 輸出:[1,2,3,4,5]
fmt.Println(tSlice5)
// 切片追加元素 輸出:[1 2 3 4 5 1 2]
fmt.Println(append(tSlice5, 1, 2))
}
Map 是一種無序的鍵值對的集合 通過 key 來快速檢索數據,key 類似於索引,指向數據的值
package main
import (
"fmt"
"reflect"
)
func main() {
// 聲明變量,默認 map 是 nil
var tMap map[string]string
// 輸出map[string]string
fmt.Println(reflect.TypeOf(tMap))
// 使用make函數創建map
tMap2 := make(map[string]string)
// 輸出map[string]string
fmt.Println(reflect.TypeOf(tMap2))
// 遍歷map
// 輸出 犀利的大熊 神奇的二熊
tMap2["犀利的"] = "大熊"
tMap2["神奇的"] = "二熊"
for key, value := range tMap2 {
fmt.Println(key, value)
}
// 刪除map內某個元素 delete
// 輸出:map[神奇的:二熊]
delete(tMap2, "犀利的")
fmt.Println(tMap2)
}