Golang中的数组和切片

简介: Golang中的数组和切片

数组

基础知识


数组是一种由固定长度的特定类型元素组成的序列,元素可以是任何数据类型,但是数组中的元素类型必须全部相同。

数组的长度在创建时就已经确定,且不可更改。

数组的下标从0开始。

数组可以使用for循环进行遍历,也可以使用range关键字进行遍历。

数组可以作为参数传递给函数,但是因为数组的长度是固定的,因此数组的长度也需要作为参数传递。


声明并初始化一个数组

var arr [5]int // 定义一个长度为 5 的 int 类型数组
arr[0] = 1 // 给数组中的第一个元素赋值为 1
fmt.Println(arr) // [1 0 0 0 0]
arr2 := [3]string{"hello", "world", "go"} // 定义一个长度为 3 的 string 类型数组并初始化
fmt.Println(arr2) // [hello world go]


遍历一个数组

arr := [5]int{1, 2, 3, 4, 5}  // 定义一个长度为 5 的 int 类型数组并初始化
// 使用 for 循环遍历数组
for i := 0; i < len(arr); i++ {
    fmt.Println(arr[i])
}
// 使用 for range 遍历数组
for index, value := range arr {
    fmt.Println(index, value)
}


切片

基础知识

  • 切片是一种动态数组,它不需要指定长度,在需要的时候可以动态地进行扩容和缩容。
  • 切片是一个引用类型,它底层的数据结构是一个数组。
  • 切片的长度可以通过len()函数获取,容量可以通过cap()函数获取。
  • 切片可以使用make()函数来创建,也可以通过对已有的数组或切片进行切片操作得到。
  • 切片的切片操作s[i:j],其中i表示切片的起始位置,j表示切片的结束位置(不包含j位置的元素),可以得到一个新的切片。
  • 切片可以使用append()函数向末尾添加元素,当容量不足时会自动进行扩容。
  • 切片可以使用copy()函数复制一个切片。


声明并初始化一个切片


// 声明一个空的 int 类型切片
var slice1 []int
// 声明并初始化一个 int 类型切片
slice2 := []int{1, 2, 3, 4, 5}
// 使用 make 函数创建一个指定长度和容量的 int 类型切片
slice3 := make([]int, 5, 10)  // 长度为 5,容量为 10

向切片中添加元素

// 使用 append 函数向切片中添加元素
slice1 := []int{1, 2, 3}
slice1 = append(slice1, 4, 5, 6)  // 添加多个元素
fmt.Println(slice1) // [1 2 3 4 5 6]
// 使用 append 函数将两个切片合并
slice2 := []int{7, 8, 9}
slice1 = append(slice1, slice2...)  // 将 slice2 中的元素打散后添加到 slice1 中
fmt.Println(slice1)  // [1 2 3 4 5 6 7 8 9]


切片的遍历和切片表达式

// 遍历切片
slice := []string{"hello", "world", "go"}
for i := 0; i < len(slice); i++ {
    fmt.Println(slice[i])
}
// 切片表达式
arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:3] // slice 的值为 [2 3],包含 arr[1] 和 arr[2]
fmt.Println(slice)
slice2 := arr[:3]  // slice2 的值为 [1 2 3],包含 arr[0]、arr[1] 和 arr[2]
fmt.Println(slice2)
slice3 := arr[3:] // slice3 的值为 [4 5],包含 arr[3] 和 arr[4]
fmt.Println(slice3)


数组和切片的区别


(1)数组的长度固定,切片的长度是动态的。

(2)数组是值类型,将一个数组赋值给另一个数组时,会将所有的元素进行复制;切片是引用类型,将一个切片赋值给另一个切片时,它们将共享底层数组。


(3)数组可以使用==运算符进行比较,切片不能使用==运算符进行比较。


(4)数组可以作为参数传递给函数,但是因为数组的长度是固定的,因此数组的长度也需要作为参数传递;切片可以直接作为参数传递给函数,不需要指定长度。

相关文章
|
6天前
|
Go
Golang切片copy踩坑
Golang切片copy踩坑
28 0
|
6天前
|
Go
golang力扣leetcode 238.除自身以外数组的乘积
golang力扣leetcode 238.除自身以外数组的乘积
19 0
|
6天前
|
Go
golang力扣leetcode 152.乘积最大子数组
golang力扣leetcode 152.乘积最大子数组
34 0
|
6天前
|
Go
golang力扣leetcode 34.在排序数组中查找元素的第一个和最后一个位置
golang力扣leetcode 34.在排序数组中查找元素的第一个和最后一个位置
71 0
|
6天前
|
Go
golang力扣leetcode 462.最少移动次数使数组元素相等II
golang力扣leetcode 462.最少移动次数使数组元素相等II
37 0
|
6天前
|
Go 索引
Golang深入浅出之-切片(Slices)入门:创建、操作与扩容机制
【4月更文挑战第20天】Go语言中的切片是动态数组,提供灵活的操作和自动扩容。本文介绍了切片的创建(通过`make()`、数组创建和切片字面量)、基本操作(索引访问、切片、赋值追加和遍历)以及扩容机制(首次和后续扩容策略)。此外,还强调了切片与底层数组的关系、切片越界问题、`append()`的使用以及理解切片的关键点,帮助提升Go编程效率和代码质量。
34 0
|
6天前
|
程序员 Go
第七章 Golang数组和切片
第七章 Golang数组和切片
26 2
|
6天前
|
Go
【Golang】使用泛型对数组进行去重
【2月更文挑战第11天】使用泛型对数组进行去重
32 0
|
6天前
|
Java Go C++
Golang每日一练(leetDay0114) 矩阵中的最长递增路径、按要求补齐数组
Golang每日一练(leetDay0114) 矩阵中的最长递增路径、按要求补齐数组
36 0
Golang每日一练(leetDay0114) 矩阵中的最长递增路径、按要求补齐数组
|
6天前
|
Java Go C++
Golang每日一练(leetDay0088) 数组的乘积、搜索二维矩阵II
Golang每日一练(leetDay0088) 数组的乘积、搜索二维矩阵II
29 0
Golang每日一练(leetDay0088) 数组的乘积、搜索二维矩阵II