目录
-
一、数组
- 1、数组的定义
- 2、数组赋值
- 3、定义并初始化
- 4、数组的大小是类型的一部分
- 5、数组是值类型
- 6、数组长度 len() 数组长度在定义阶段已经固定
- 7、数组循环
- 8、多维数组
- 9、数组定义并指定位置初始化
-
二、切片基础
- 1、切片的定义
- 2、使用切片
- 3、修改切片,会影响数组
- 4、修改数组也会影响切片
- 5、切片只切数组的一部分
- 6、当多个切片共用相同的底层数组时,每个切片所做的更改将反应在数组中
- 7、切片的长度和容量
- 8、切片追加值
一、数组
数组是同一类型元素的集合,可以放多个值,但是类型一致,内存中连续存储
Go 语言中不允许混合不同类型的元素,而且数组的大小,在定义阶段就确定了,不能更改
1、数组的定义
//定义一个大小为3的string类型和int8类型的数组,里面可以放3个字符串和3个数字var names [3]stringvar ages [3]int8fmt.Println(names, ages) //输出:[ ] [0 0 0]
2、数组赋值
var ages [3]int8ages[0] = 18ages[2] = 22fmt.Println(ages)fmt.Println(ages[1])//输出[18 0 22]0
3、定义并初始化
//方式一:var ages [3]int = [3]int{1, 2, 3}fmt.Println(ages) //输出:[1 2 3]//方式二:var ages = [3]int{1, 2, 3}fmt.Println(ages) //输出:[1 2 3]//方式三:...后面放几个值,数组大小就是多少var ages = [...]int{1, 2, 3, 4, 5, 6, 7, 8}fmt.Println(ages) //输出:[1 2 3 4 5 6 7 8]//方式四:ages := [...]int{1, 2, 3, 4, 8}fmt.Println(ages) //输出:[1 2 3 4 8]
4、数组的大小是类型的一部分
var a [2]int = [2]int{1, 2}var b [2]int = [2]int{1, 3}b = a //如果不是同一种类型,不允许相互赋值fmt.Println(b)
5、数组是值类型
copy
var a = [2]int{1, 2}fmt.Println(a) //[1 2]test(a) //[99 2]fmt.Println(a) //[1 2]func test(a [2]int) { a[0] = 99 fmt.Println(a)}
6、数组长度 len() 数组长度在定义阶段已经固定
var a = [2]int{1, 2} fmt.Println(len(a)) //输出:2
7、数组循环
//普通循环var a = [...]int{7, 6, 5, 4, 3, 2, 1}fori := 0; i < len(a); i++ { fmt.Println(a[i])}//通过 range 来循环(range不是一个内置函数,是一个关键字如:for,if,else)//如果用一个变量接收,这个值是可迭代的索引//如果用两个变量接收,这两个变量一个是索引,一个是具体的值var a = [...]int{7, 6, 5, 4, 3, 2, 1}fori, value := range a { fmt.Println(i) //索引 fmt.Println(value) //值}//不要索引只要值循环打印for_, value := range a { fmt.Println(value)}
8、多维数组
var a [3][3]int //定义a[0][1] = 20 //使用fmt.Println(a) //输出:[[0 20 0] [0 0 0] [0 0 0]]//定义并赋初始值var a [3][3]int = [3][3]int{{1}, {2, 3, 4}, {5, 6}}fmt.Println(a) //输出:[[1 0 0] [2 3 4] [5 6 0]]//循环多维数组var a [3][3]int = [3][3]int{{1}, {2, 3, 4}, {5, 6}}for_, value := range a { for_, inValue := range value { fmt.Println(inValue) }}
9、数组定义并指定位置初始化
//在索引为5和7的位置指定初始化值var ages [10]int = [10]int{5: 55, 7: 77}fmt.Println(ages) //输出:[0 0 0 0 0 55 0 77 0 0]
二、切片基础
Wrapper
它本身不拥有任何数据,只对现有数组的引用。
1、切片的定义
//定义一个数组var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}//基于数组,做一个切片b := a[:]fmt.Println(b) //输出:[9 8 7 6 5 4 3 2 1 0]fmt.Printf("%T", b) //输出:[]int 中括号中不带东西,就是切片类型fmt.Println(a) //输出:[9 8 7 6 5 4 3 2 1 0]fmt.Printf("%T", a) //输出:[10]int
2、使用切片
var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[:]fmt.Println(b[0]) //输出:9fmt.Println(b[2]) //输出:7
3、修改切片,会影响数组
var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[:]b[0] = 99 //修改切片fmt.Println(b) //输出:[99 8 7 6 5 4 3 2 1 0]//数组会被修改fmt.Println(a) //输出:[99 8 7 6 5 4 3 2 1 0]
4、修改数组也会影响切片
var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[:]a[1] = 99 //修改数组fmt.Println(a) //输出:[9 99 7 6 5 4 3 2 1 0]//切片也会被修改fmt.Println(b) //输出:[9 99 7 6 5 4 3 2 1 0]
5、切片只切数组的一部分
var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[3:6]//修改切片b[0] = 66fmt.Println(b) //输出:[66 5 4]fmt.Println(a) //输出:[9 8 7 66 5 4 3 2 1 0]//修改数组a[4] = 55fmt.Println(b) //输出:[66 55 4]fmt.Println(a) //输出:[9 8 7 66 55 4 3 2 1 0]
6、当多个切片共用相同的底层数组时,每个切片所做的更改将反应在数组中
var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[3:5]c := a[4:6]fmt.Println(a) //输出:[9 8 7 6 5 4 3 2 1 0]fmt.Println(b) //输出:[6 5]fmt.Println(c) //输出:[5 4]b[1] = 555fmt.Println(a) //输出:[9 8 7 6 555 4 3 2 1 0]fmt.Println(b) //输出:[6 555]fmt.Println(c) //输出:[555 4]
7、切片的长度和容量
var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[3:7]fmt.Println(b) //输出:[6 5 4 3]fmt.Println(a) //输出:[9 8 7 6 5 4 3 2 1 0]//切片长度fmt.Println(len(b)) //输出:4//切片容量(我最多能存多少值,从切片的起始位置开始往后所有的,从索引为3开始)fmt.Println(cap(b)) //输出:7
8、切片追加值
var a = [10]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}b := a[6:8]b = append(b,11)b = append(b,22)fmt.Println(a) //输出:[9 8 7 6 5 4 3 2 11 22]//追加到临界点了在追加b = append(b,33)b = append(b,44)fmt.Println(a) //输出:[9 8 7 6 5 4 3 2 11 22]fmt.Println(b) //输出:[3 2 11 22 33 44]//数组长度不会在变了,他会在原来基础上翻倍,把我原来那个值copy到我新的数组上a和b已经没有关系了b[0] = 33fmt.Println(b) //输出:[33 2 11 22 33 44]fmt.Println(a) //输出:[9 8 7 6 5 4 3 2 11 22]
原文链接:https://www.cnblogs.com/XiaoYang-sir/p/15375931.html