Golang——4、数组、切片和map

Golang数组、切片、map及排序算法详解

1、数组

1.1、数组定义

数组是指一系列同一类型数据的集合。 数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型, 比如int、string等, 也可以是用户自定义的类型。一个数组包含的元素个数被称为数组的长度。在Golang中数组是一个长度固定的数据类型,数组的长度是类型的一部分,也就是说[5]int和[10]int是两个不同的类型。Golang中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速度非常快。

和数组对应的类型是Slice(切片) ,Slice是可以增长和收缩的动态序列,功能也更灵活,但是想要理解Slice工作原理的话需要先理解数组,所以本节主要为大家讲解数组的使用。

数组的定义:
在这里插入图片描述

数组的长度也是类型的一部分。

var arr1 [3]int
var arr2 [5]int
var strArr [5]string
fmt.Printf("值: %v, 类型: %T\n", arr1, arr1)
fmt.Printf("值: %v, 类型: %T\n", arr2, arr2)
fmt.Printf("值: %v, 类型: %T\n", strArr, strArr)

在这里插入图片描述


1.2、数组的初始化

方式一:先定义后初始化。

var arr [3]int
arr[0] = 1
arr[1] = 2
arr[2] = 3

方式二:定义的时候初始化。

var arr1 = [3]int{
   
   1, 2, 3}
var arr2 = [3]string{
   
   "C++", "Java", "Go"}

方式三:一般情况下我们可以让编译器根据初始值的个数自行推断数组的长度。

var arr1 = [...]int{
   
   1, 5, 2, 67, 123}
fmt.Println(arr1)
fmt.Println(len(arr1))

在这里插入图片描述

方式四:使用指定索引值的方式来初始化数组。

arr := [...]int{
   
   1: 10, 2: 30, 6: 7}
fmt.Println(arr)
fmt.Println(len(arr))

在这里插入图片描述
上面的{}中,冒号左边表示下标,右边表示值,最终数组长度取决于最大的下标,其他没有赋值的下标都为默认值0。


1.3、数组的遍历

方式一:for循环。

var arr = [5]int{
   
   1, 2, 3, 4, 5}
for i := 0; i < len(arr); i++ {
   
   
	fmt.Printf("arr[%d]: %d\n", i, arr[i])
}

在这里插入图片描述

方式二:for range遍历。

strArr := [...]string{
   
   "C++", "Java", "Golang", "Python"}
for k, v := range strArr {
   
   
	fmt.Printf("strArr[%d]: %s\n", k, v)
}

在这里插入图片描述


1.4、数组是值类型

值类型:改变变量副本值的时候,不会改变变量本身的值。
引用类型:改变变量副本值的时候,会改变变量本身的值。
类似于C++中的引用类型。

值类型:基本数据类型和数组都是值类型。

var arr1 = [...]int{
   
   1, 2, 3}
arr2 := arr1
arr2[0] = 10
fmt.Println(arr1)
fmt.Println(arr2)

在这里插入图片描述

下面展示切片,切片是引用类型。

var arr1 = []int{
   
   1, 2, 3}  // 切片
arr2 := arr1
arr2[0] = 10
fmt.Println(arr1)
fmt.Println(arr2)

在这里插入图片描述
切片相对于数组区别就在于:数组[]中指明了元素个数,而切片[]中不填写任何值。我们发现拷贝的arr2数组,修改了第一个元素的值后,arr1和arr2数组的第一个元素都变成了10。这是因为arr1和arr2指向的空间是同一块。


1.5、多维数组

Go语言是支持多维数组的,我们这里以二维数组为例(数组中又嵌套数组)。
在这里插入图片描述

二维数组的定义:

var arr = [3][2]string{
   
   
	{
   
   "北京", "上海"},
	{
   
   "广州", "深圳"},
	{
   
   "成都", "重庆"},
}
fmt.Println(arr)
fmt.Printf("类型: %T", arr)

在这里插入图片描述

二维数组的另一种定义方式,可以自动推导行,但不可推导列。

var arr = [...][2]string{
   
   
	{
   
   "北京", "上海"},
	{
   
   "广州", "深圳"},
	{
   
   "成都", "重庆"},
}

二位数组的两种遍历方式,for和for range。

var arr = [...][2]string{
   
   
	{
   
   "北京", "上海"},
	{
   
   "广州", "深圳"},
	{
   
   "成都", "重庆"},
}

for i := 0; i < len(arr); i++ {
   
   
	for j := 0; j < len(arr[i]); j++ {
   
   
		fmt.Printf("%s ", arr[i][j])
	}
	fmt.Println()
}

for _, v1 := range arr {
   
   
	for _, v2 := range v1 {
   
   
		fmt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值