文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go语言中的数组与切片介绍

2024-04-02 19:55

关注

这篇文章主要讲解了“Go语言中的数组与切片介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中的数组与切片介绍”吧!

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

感谢各位的阅读,以上就是“Go语言中的数组与切片介绍”的内容了,经过本文的学习后,相信大家对Go语言中的数组与切片介绍这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯