初心是记录和总结,自己学习Go语言的历程。如果能帮助到你,这是我的荣幸。
数组
当我们需要存很多相同类型变量时,我们并不用定义多个变量,只需要一个容器变量来帮我们存储,这个容器就是数组。
记住!数组是定长!数组是定长!在Go语言我们一定要指定长度,或者用
[...]
,记牢这个,因为等会还有个切片。
语法:var 数组名 [指定数组长度]存放的类型 = [指定数组长度]存放的类型{值1,值2...}
例子:
// 定义一个数组(定长),并给予初始化
var array [2]int = [2]int{1,2}
fmt.Println(array) //[1 2]
如果不初始化的话,像这样直接定义var array [2]int
,则会输出[0 0]
,这表示将定义好的数组类型自动初始化(在没有赋值的情况下)
记忆碎片:这种初始化的方法其实和Java类似也是将值放在{ }
中。而定义的形式都是遵从 变量定义的形式:var 名字 类型
,唯一值得注意的就是需要在{ }
再声明一下类型,这里我编译的时候会提示方法的字眼,可能是执行时告知这 并不是一个方法。
简易语法:数组名 := [指定数组长度]存放的类型{值1,值2...}
例子:
// 当然我们可以使用简易定义的方式 :=
array1 := []int{3,4}
fmt.Println(array1) //[3 4]
获取数组的长度:
length := len(array1) //2
获取数组的容量:
length := cap(array1) //2,因为数组是定长啊!
记忆碎片: 使用
:=
方便之处是不用写var定义,而且类型是自动推导的
特殊用法:跳跃式指定值
array2 := [3]int{0:0,2:2}
fmt.Println(array2) //[0,0,2]
它的含义是:{对应的下标元素:赋什么值}
,这里将 下标0 和 下标2 的元素分别赋值为0和2,而下标为1取默认值0
使用 range 循环数组
代码示例:
for index,value := range array3{
fmt.Println(index,value)
// 0 0
// 1 0
// 2 2
}
使用for
搭配range
有点Java的加强for循环的味道。index
表示是数组的下标,value
表示的是数组该下标对应的值。
正常for循环就是使用len(数组名)
获取长度,然后遍历下标通过数组名[i]
一一取值,不再赘述,可以自己尝试。
不想写指定长度,因为可能给我的数字太多了
甲:我这给你一堆相同的值,你给我放到数组中
乙:我数一数...1,2,3.....101...
当然拒绝!搬上[...]
的用法(肯定有人说,Java都可以直接那啥用[ ]空着...嗯,我也想这样说,但谁让这是Go的语法呢~)
array4 := [...]int{1,2,3}
就是那么简单,[...]
用上了,我们可以不同再写数组的长度,就是避免万一值太多了数不过来呢。
切片 -- 可变长的数组
啊!到切片了,这名字怪怪的,就知道它是个可变长的数组就行咯。
语法:
slice := []int{} //[]
这声明了一个空的切片,输出的是[]
追加元素
slice := []int{}
slice = append(slice,1)
append
的用法:append(切片名,追加元素,...),可同时追加多个元素
注意:切片之所以可以动态的追加,是因为append会判断有没有超过切片的容量,没有话会直接添加内容,如果超出容量会 成倍扩增容量。
这个成倍是啥意思呢?就拿上面代码为例子,slice = append(slice,1)
后slice
的容量为1,当再增加一个内容的时候超过了切片的容量,这个时候,就会把切片的容量*2倍
,如果*2倍
还放不下的话,就会将容量扩容到 >= 真实值的一个容量,为什么是 >= 呢?这个留到以后我们分析源码的时候再填坑。现在猜测是一种取整的方式。
总之!这个切片可以通过append
无限添新值(内存无限的情况)
取切片的片段
想到这个切片啊,学过Python
的同学也会狂喜,啊没错,它还真有[:]
的这种用法,但是这种用法取出来的是切片的片段,并不是它的值哦!
切片名 [索引开始:索引结束]
默认索引是从0开始,最后元素的索引是:长度-1
其中索引开始是包含,索引结束是不包含,简单记忆就是,左闭右开原则。通过几个例子简单了解一下吧。
slice := []int{}
slice = append(slice,1,2,3,4,5,6,7,8)
fmt.Println(slice[:]) //[1 2 3 4 5 6 7 8]
fmt.Println(slice[1:]) //[2 3 4 5 6 7 8]
fmt.Println(slice[len(slice)-1:]) //[8]
fmt.Println(slice[0:1]) //[1]
fmt.Println(slice[0]) //1 这个是取出值啊