【Golang 计划】03 Go 基础三-数组与切片

125 阅读1分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

数组

定义

同一种数据类型的固定长度的序列。

  • 数组定义:var a [len]int , 数组长度是常量,且是类型的组成部分,一旦定义长度就不能变
  • 长度是组数类型的一部分,因 var a[5] int 和 var a [10]int 是不同的类型
  • 数组遍历
for i:=0; i< len(a); i++ {
}
​
for index, v := range a {
}
  • 访问越界,会 panic
  • 数组是值类型,赋值和传参会复制整个数组,而不是指针,因此改变副本的值,不会改变本身的值
  • 支持 == ,!= 操作符,因内存总是被初始化过
  • 指针数组 [n]*T , 数组指针 *[n]T

初始化

# 全局初始化,必须要使用 var
var arr [5]int = [5]int{1,2,3} // 未赋值都将默认为 0
var arr1 =  [5]int{1,2,3,4,5} 
var arr2 = [...]int{1,2,3,4,5,6}
var str = [5]string{3:"hi",4:"tom"} //其余将默认为空字符串
​
# 局部初始化
a := [3]int{1, 2}           // 未初始化元素值为 0。
b := [...]int{1, 2, 3, 4}   // 通过初始化值确定数组长度。
c := [5]int{2: 100, 4: 200} // 使用索引号初始化元素。

数组拷贝和传参数

因数组是引用类型,可以通过使用指针的方式,进行数组的拷贝和传参

切片

定义

定义:切片是数组的一个引用,因此切片是引用类型。但自身是结构体,值拷贝传递。

  • 切片的长度可以改变,因此,切片是一个可变的数组
  • 切片遍历方式和数组一样,可以用len()求长度。表示可用元素数量,读写操作不能超过该限制。
  • cap可以求出slice最大扩张容量,不能超出数组限制。0 <= len(slice) <= len(array),其中array是slice引用的数组。

所以,切片 slice 类似数组,但是 slice 并不是数组或数组指针。它通过内部指针和相关属性引用数组片段,以实现变长方案

切片初始化

全局:
var arr = [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var slice0 []int = arr[start:end] 
var slice1 []int = arr[:end]        
var slice2 []int = arr[start:]        
var slice3 []int = arr[:] 
var slice4 = arr[:len(arr)-1]      //去掉切片的最后一个元素
局部:
arr2 := [...]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
slice5 := arr[start:end]
slice6 := arr[:end]        
slice7 := arr[start:]     
slice8 := arr[:]  
slice9 := arr[:len(arr)-1] //去掉切片的最后一个元素