数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型
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)
}