Go语言中的数组与切片介绍
创始人
2024-12-21 22:42:17
0次

1. 数组

数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,所以在Go语言中很少直接使用数组。

声明数组,并给该数组里的每个元素赋值(索引值的最小有效值和其他大多数语言一样是 0,不是1)

//[3]里的3表示该数组的元素个数 vararr[3]int arr[0]=1 arr[1]=2 arr[2]=3

声明并直接初始化数组

//第一种方法 vararr[3]int=[3]int{1,2,3} //第二种方法 arr:=[3]int{1,2,3}

上面的 3 表示数组的元素个数 ,万一你哪天想往该数组中增加元素,你得对应修改这个数字,为了避免这种硬编码,你可以这样写,使用...让Go语言自己根据实际情况来分配空间。

arr:=[...]int{1,2,3}

[3]int和[4]int虽然都是数组,但他们却是不同的类型,使用 fmt 的%T可以查得,如果使用 == 来比较,答案会是false

import("fmt" ) funcmain(){arr01:=[...]int{1,2,3}arr02:=[...]int{1,2,3,4}fmt.Printf("%d的类型是:%T\n",arr01,arr01)fmt.Printf("%d的类型是:%T",arr02,arr02)}

输出 如下

[1 2 3]的类型是:[3]int [1 2 3 4]的类型是:[4]int

如果你觉得每次写[3]int有点麻烦,你可以为[3]int定义一个类型字面量,也就是别名类型。

使用type关键字可以定义一个类型字面量,后面只要你想定义一个容器大小为3,元素类型为int的数组 ,都可以使用这个别名类型。

import("fmt" ) funcmain(){typearr3[3]int myarr:=arr3{1,2,3}fmt.Printf("%d的类型是:%T",myarr,myarr)}

输出 如下

[123]的类型是:main.arr3

2. 切片

切片(Slice)与数组一样,也是可以容纳若干类型相同的元素的容器。与数组不同的是,无法通过切片类型来确定其值的长度。每个切片值都会将数组作为其底层数据结构。我们也把这样的数组称为切片的底层数组。

切片是对数组的一个连续片段的引用,所以切片是一个引用类型,这个片段可以是整个数组,也可以是由起始和终止索引标识的一些项的子集,需要注意的是,终止索引标识的项不包括在切片内(意思是这是个左闭右开的区间)

import("fmt" ) funcmain(){myarr:=[...]int{1,2,3}fmt.Printf("%d的类型是:%T",myarr[0:2],myarr[0:2])}

输出 如下

[1 2]的类型是:[]int

切片的构造,有三种方式

    对数组进行片段截取(上面例子已经展示:myarr[0:2],0是索引起始值,2是索引终止值,区间左半右开)

    从头声明赋值(例子如下)

    //声明字符串切片 varstrList[]string //声明整型切片 varnumList[]int //声明一个空切片 varnumListEmpty=[]int{}

    使用 make 函数构造,make 函数的格式:make( []Type, size, cap )

    这个函数刚好指出了,一个切片具备的三个属性:类型(Type),长度(size),容量(cap)

    import("fmt" ) funcmain(){a:=make([]int,2)b:=make([]int,2,10)fmt.Println(a,b)fmt.Println(len(a),len(b))fmt.Println(cap(a),cap(b))}

    输出 如下

    [00][00] 22 210

关于 len 和 cap 的概念,可能不好理解 ,这里举个例子:

公司名,就是变量名。公司里的所有工位,相当于已分配到的内存空间公司里的员工,相当于元素。cap 代表你这个公司最多可以容纳多少员工len 代表你这个公司当前有多少个员工,所以cap>=len

由于 切片是引用类型,所以你不对它进行赋值的话,它的零值(默认值)是 nil

varmyarr[]int fmt.Println(myarr==nil) //true

数组 与 切片 有相同点,它们都是可以容纳若干类型相同的元素的容器

也有不同点,数组的容器大小固定,而切片本身是引用类型,它更像是 Python 中的 list ,我们可以对它 append 进行元素的添加。

import("fmt" ) funcmain(){myarr:=[]int{1}//追加一个元素 myarr=append(myarr,2)//追加多个元素 myarr=append(myarr,3,4)//追加一个切片,...表示解包,不能省略 myarr=append(myarr,[]int{7,8}...)//在第一个位置插入元素 myarr=append([]int{0},myarr...)//在中间插入一个切片(两个元素) myarr=append(myarr[:5],append([]int{5,6},myarr[5:]...)...)fmt.Println(myarr)}

输出 如下

[012345678]

最后,给你留一道思考题,如下这段代码:

import("fmt" ) funcmain(){varnumbers4=[...]int{1,2,3,4,5,6,7,8,9,10}myslice:=numbers4[4:6:8]fmt.Printf("myslice为%d,其长度为:%d\n",myslice,len(myslice))myslice=myslice[:cap(myslice)]fmt.Printf("myslice的第四个元素为:%d",myslice[3])}

为什么 myslice 的长度为2,却能访问到第四个元素?

myslice为[56],其长度为:2 myslice的第四个元素为:8

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...