1.数组
数组存放同种数据类型的集合, 可以通过索引去访问 ,长度不可以被改变 ,容量等于长度
数组是值类型 ,赋值会拷贝副本
数组作为参数 ,函数收到的是数组拷贝而不是指针
1 package main 2 3 import ( 4 "fmt" 5 "reflect" 6 ) 7 8 func main() { 9 var numbers [3]int 10 var numbers1 = [2]int{1, 2} //直接写数组值 11 numbers3 := [...]int{1, 2, 3, 4, 5} //自动计算长度 12 13 numbers[0] = 1 14 for _, i := range numbers { 15 fmt.Println(i, reflect.TypeOf(i)) 16 } 17 fmt.Println(numbers[0]) 18 fmt.Println(numbers) 19 fmt.Println(numbers1) 20 fmt.Println(numbers3) 21 }
2.切片
切片底层是数组中连续的一个片段 ,切片由三部分组成: "指向数组的指针" "容量" "长度"
切片比数组更加灵活 ,可以新增删除插入复制切片能自动调整大小
识别切片和数组 ,切片长度
创建方式: 可以创建空切片 ,创建带值的切片 ,使用make创建还可以指定初始长度
1 package main 2 3 import "fmt" 4 5 func main() { 6 slice1 := []int{} 7 slice2 := []string{"1","2","3"} 8 slice3 := make([]string,3) //初始化长度为3 ,后面还可以指定容量,不指定默认为length=capacity 9 fmt.Println(slice1,slice2,slice3) 10 }
切片通过索引切出来的切片 ,虽然是新的切片但是底层同属一个数组 ,修改会影响所有
1 package main 2 3 import "fmt" 4 5 func main() { 6 slice1 := make([]string, 3) 7 slice1[0], slice1[1], slice1[2] = "A", "B", "C" 8 slice2 := slice1[:1] 9 fmt.Println(slice1,slice2) 10 slice2[0] = "O" 11 fmt.Println(slice1,slice2) 12 }
切片通过索引来修改值
append函数完成切片的 : 追加 删除 插入 append实际上就是将参数中的切片拼接
追加 ,可追加多个元素
1 package main 2 3 import "fmt" 4 5 func main() { 6 slice1 := make([]string, 3) 7 slice1[0], slice1[1], slice1[2] = "A", "B", "C" 8 slice1 = append(slice1, "A","A","A") 9 fmt.Println(slice1) 10 }
删除
1 package main 2 3 import "fmt" 4 5 func main() { 6 slice1 := make([]string, 3) 7 slice1[0], slice1[1], slice1[2] = "A", "B", "C" 8 slice1 = append(slice1[:1],slice1[1+1:]...) 9 fmt.Println(slice1) 10 }
插入 ,需要使用copy函数将切片复制出来避免操作同一数组
1 package main 2 3 import "fmt" 4 5 func insert(slice1 []string, index int, val string) []string { 6 temp_q := slice1[:index] 7 temp_h := make([]string, len(slice1[index:])) 8 copy(temp_h, slice1[index:]) 9 temp_q = append(temp_q, val) 10 slice1 = append(temp_q, temp_h...) 11 return slice1 12 } 13 14 func main() { 15 slice1 := make([]string, 3) 16 slice1[0], slice1[1], slice1[2] = "A", "B", "C" 17 slice1 = insert(slice1, 1, "BH") 18 fmt.Println(slice1) 19 }
copy函数完成切片复制
copy(目标切片 ,源切片) #目标切片创建必须使用make函数 ,并指定长度等于源切片
1 package main 2 3 import "fmt" 4 5 func main() { 6 slice2 := []string{"1","2"} 7 slice1 := make([]string,len(slice2)) 8 copy(slice1,slice2) 9 fmt.Println(slice1) 10 }
判断切片是否为空可以判断切片类型是否为nil
3.映射
go的映射就是字典 ,通过hash表实现 ,可以通过k快速访问v ,可以看做k:v的无序集合
映射的增删改查
1 package main 2 3 import "fmt" 4 5 func main() { 6 dic1 := make(map[string]int) 7 dic1["小明"] = 18 8 dic1["小王"] = 28 9 dic1["小李"] = 38 10 fmt.Println(dic1) 11 fmt.Println(dic1["小明"]) 12 delete(dic1, "小明") 13 fmt.Println(dic1) 14 }
4.为空校验
切片与映射是否为空可以通过 nil 与长度是否为0判断
数组是否为空可以通过数组的类型 ,取出[0]位置值 与该类型的零值比较判断
1 package main 2 3 import "fmt" 4 5 func main() { 6 //var dic1 map[string]int //var声明的无值为nil 7 dic1 := make(map[string]int) //简短声明可以用长度判断 8 if dic1 == nil || len(dic1) == 0 { 9 fmt.Println("字典为空") 10 } 11 } 12 13 14 package main 15 16 import "fmt" 17 18 func main() { 19 //var slice1 []string 20 slice1 := []string{} 21 if slice1 == nil || len(slice1) == 0 { 22 fmt.Println("切片为空") 23 } 24 25 } 26 27 package main 28 29 import "fmt" 30 31 func main() { 32 var arr1 [5]string 33 if arr1[0] == "" { 34 fmt.Println("数组为空") 35 } 36 }