GO语言切片 | 青训营;

59 阅读4分钟

数组

数组是一种数据类型元素的集合。在Go语言中,数组在声明时就必须确定它的数据类型以及长度,虽然数组在使用时可以修改其数据,但是数组大小无法改变。它可以存储相同类型的固定长度的数据序列。数组的长度是类型的一部分,所以不同长度的数组是不兼容的。数组可以通过索引来访问或修改元素,索引从 0 开始,第一个元素的索引为 0,第二个元素的索引为 1,以此类推。

数组的定义

数组在定义时的长度必须是常量,数组的长度也是数组类型的一部分。不同长度的数组是不同类型的。例如[10]int[100]int是不同的类型。

var 数组变量名 [元素数量]T
var a [5]int
var b [50]int

数组的初始化

数组必须经过初始化才可以使用。

// 声明并初始化一个长度为 5 的整数数组
var arr2 = [5]int{1, 2, 3, 4, 5}

// 使用简短声明语法声明并初始化一个长度为 5 的整数数组
arr3 := [5]int{1, 2, 3, 4, 5}

遍历数组

数组遍历可以通过for i...的方式或者for range的方式。

func main() {
arr := [...]string{"aaa", "bbb", "ccc", "ddd"} 
//通过for i的方式进行遍历 
for i:=0; i<len(arr); i++ {
fmt.Println(arr[i]) 
} //aaa //bbb //ccc //ddd 
//通过for range的方式进行遍历 
//index表示索引,value表示值
for index, value := range arr {
fmt.Println(index, value)
} //0 aaa //1 bbb //2 ccc //3 ddd
}

多维数组

定义

多维数组在定义上与一维数组几乎一致,只是在内层又嵌套了几层。

// 声明一个二维整数数组
var arr5 [2][3]int

// 声明并初始化一个二维整数数组
var arr6 = [2][3]int{{1, 2, 3}, {4, 5, 6}}

多维数组的遍历

多维数组的遍历与一维数组的遍历几乎一致

func main(){
 arr := [3][2]string{
         {"广东","广州"},
         {“云南”,“贵州”},
         {"河南”,"常州”},
}
for _,row := range arr{
for _,val :=range row{
fmt.Printf("%v\t",val)
}
fmt.Printf()
}

切片

切片是一种动态数组,它可以在运行时改变长度和容量,而不需要重新分配内存。切片是对底层数组的一个连续片段的引用,所以修改切片的元素会影响底层数组。切片有三个属性:长度、容量和指针。长度是切片中元素的个数,容量是从切片的指针开始到底层数组的末尾的元素个数,指针是指向底层数组中切片第一个元素的地址。

有多种方式可以创建和初始化切片,例如:

  • 从数组或切片中截取一段,使用 slice[start:end] 的语法,其中 start 和 end 是索引值,可以省略。
  • 使用 make 函数,指定切片的类型、长度和容量,例如 make([]int, 5, 10)。
  • 使用字面量,直接给切片赋值,例如 []int{1, 2, 3}。

切片可以使用 append 函数来追加元素,如果切片的容量不够,会自动扩展底层数组。切片也可以使用 copy 函数来复制元素,如果目标切片的容量小于源切片的长度,只会复制部分元素。

切片的表达式

我们可以通过len()来获取切片的长度,也可以使用cap()来获取切片的容量。

切片表达式有两种,一种是只指定lowhigh两个索引界限值,还有一种是除了lowhigh还要指定容量。

通过上面的学习,我们了解到了切片的底层也是数组,因此我们可以通过切片表达式来得到切片。切片表达式中的lowhigh表示索引范围(左包含,右不包含)。而得到的新切片的长度=high-low,而新切片的容量=原切片的长度-low

n := [5]int{1, 2, 3, 4, 5} // 声明一个长度为 5 的数组
n1 := n[1:] // 从 n 数组中截取,省略了 high,默认为数组的长度
fmt.Println(n1) // 输出 [2 3 4 5]
n2 := n1[1:3] // 从 n1 切片中截取,指定了 low 和 high
fmt.Println(n2) // 输出 [3 4]
n := [5]int{1, 2, 3, 4, 5} // 声明一个长度为 5 的数组
n1 := n[1:3:4] // 从 n 数组中截取,指定了 low、high 和 max
fmt.Println(n1) // 输出 [2 3]
fmt.Println(cap(n1)) // 输出 3