我们一起聊聊Go语言中的数组和切片

2024年 5月 17日 104.1k 0

数组

定义

一维数组

一维数组是具有相同数据类型的固定大小的数据序列。在Go语言中,一维数组的定义形式为var arrayName [size]dataType,其中arrayName是数组的名称,size是数组的大小,dataType是数组中元素的数据类型。

多维数组

多维数组是数组的数组,也就是说数组中的元素又是数组。多维数组的定义形式为var arrayName [size1][size2]...[sizeN]dataType,其中size1、size2等是各个维度的大小,dataType是数组中元素的数据类型。

使用

数组可以通过索引来访问和修改元素,索引从0开始计数。例如,对于一维数组arr,可以通过arr[index]来访问第index个元素;对于多维数组arr,可以通过arr[index1][index2]...[indexN]来访问多维数组中的元素。

package main


import "fmt"


func main() {
	// 一维数组的访问和修改
	arr := [5]int{1, 2, 3, 4, 5}
	fmt.Println("一维数组:", arr)
	fmt.Println("第二个元素:", arr[1]) // 输出:2


	// 修改第三个元素为10
	arr[2] = 10
	fmt.Println("修改后的数组:", arr)


	// 多维数组的访问和修改
	matrix := [2][3]int{
		{1, 2, 3},
		{4, 5, 6},
	}
	fmt.Println("多维数组:", matrix)
	fmt.Println("第二行第三个元素:", matrix[1][2]) // 输出:6


	// 修改第一个元素为100
	matrix[0][0] = 100
	fmt.Println("修改后的多维数组:", matrix)
}

上面的代码演示了如何访问和修改一维数组和多维数组中的元素。

初始化

Go语言中数组的初始化有两种方式:一种是使用数组字面量直接初始化数组,另一种是通过索引逐个赋值来初始化数组。

package main


import "fmt"


func main() {
	// 使用数组字面量直接初始化数组
	arr1 := [3]int{1, 2, 3}
	fmt.Println("数组字面量初始化:", arr1)


	// 使用索引逐个赋值来初始化数组
	var arr2 [3]int
	arr2[0] = 1
	arr2[1] = 2
	arr2[2] = 3
	fmt.Println("索引逐个赋值初始化:", arr2)
}

上面的代码演示了使用数组字面量和索引逐个赋值两种方式来初始化数组。

相关函数

数组的常用函数有len()和cap(),其中len()函数用于返回数组的长度,cap()函数用于返回数组的容量。数组还支持切片操作,可以使用切片语法来获取数组的子集。

package main


import "fmt"


func main() {
	// 定义数组
	arr := [5]int{1, 2, 3, 4, 5}


	// 使用 len() 函数获取数组长度
	fmt.Println("数组长度:", len(arr)) // 输出:5


	// 使用 cap() 函数获取数组容量
	fmt.Println("数组容量:", cap(arr)) // 输出:5


	// 使用切片操作获取数组的子集
	subArr := arr[1:3] // 获取从索引1到索引2(不包含索引3)的子集
	fmt.Println("数组的子集:", subArr) // 输出:[2 3]
}

上面的代码演示了如何使用len()和cap()函数获取数组的长度和容量,以及如何使用切片操作获取数组的子集。

切片

定义

切片是一个拥有相同类型元素的可变长度的序列。在Go语言中,切片的定义形式为var sliceName []dataType,其中sliceName是切片的名称,dataType是切片中元素的数据类型。

初始化

切片可以通过切片字面量或使用内置的make()函数来初始化。

使用切片字面量初始化切片

package main
import "fmt"
func main() {
	// 使用切片字面量初始化切片
	slice1 := []int{1, 2, 3, 4, 5}
	fmt.Println("切片字面量初始化
", slice1)
}

上面的代码演示了使用切片字面量来初始化切片。切片字面量可以直接指定切片的内容。

使用 make() 函数初始化切片

package main
import "fmt"
func main() {
	// 使用 make() 函数初始化切片
	slice2 := make([]int, 3, 5) // 创建一个长度为3,容量为5的切片
	fmt.Println("使用 make() 函数初始化
", slice2)
}

上面的代码演示了使用make()函数来初始化切片。使用make()函数时,需要指定切片的长度和容量。

使用

切片可以像数组一样通过索引来访问和修改元素,索引从0开始计数。例如,对于切片slice,可以通过slice[index]来访问第index个元素,并且可以通过该语法来修改切片中的元素值。

除了与数组相似的索引操作外,切片还支持动态增加或删除元素的操作。使用内置的append()函数可以向切片中添加新的元素,而使用切片的切片操作可以从切片中删除元素。这种灵活的操作使得切片在处理动态数据集合时非常方便。

以下是使用切片进行访问、修改以及动态增加元素的示例代码

package main


import "fmt"


func main() {
	// 定义切片
	slice := []int{1, 2, 3, 4, 5}


	// 访问切片元素
	fmt.Println("第三个元素:", slice[2]) // 输出:3


	// 修改切片元素
	slice[2] = 10
	fmt.Println("修改后的切片:", slice) // 输出:[1 2 10 4 5]


	// 动态增加元素
	slice = append(slice, 6)
	fmt.Println("增加元素后的切片:", slice) // 输出:[1 2 10 4 5 6]
}

上面的代码展示了使用切片进行访问、修改以及动态增加元素的操作。

和数组的区别

  • 大小:数组的大小是固定的,而切片的大小是动态可变的。
  • 初始化:数组需要提前声明大小并分配内存空间,而切片可以动态增长或缩小。
  • 传递方式:数组作为函数参数时会进行值拷贝,而切片作为函数参数时是引用传递,不会进行值拷贝。
  • 底层实现:数组是值类型,切片是引用类型,底层数据结构不同。

这些是数组和切片在定义、初始化、使用和特性上的主要区别。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论