go破冰之旅·9·数组与切片(一)

news/2024/7/7 22:42:59

 一次5-10分钟即可搞定,实用+效率!

上文中,我们重点看了下函数的常用实践及各种玩法:函数相关

本文开始分为几小节我们来看看go中的数组和切片如何play,因篇幅和效率控制,本文重点看看数组。

目录

数组

数组的变更(数组内容、指针等结合)

数组指针 and 指针数组


数组

数组是一批同数据类型的数据集合,是一个数据列表,它的特点如下:

1,就是存储的所有数据的数据类型都相同,数据类型既可以是内置的类型、也可以是自定义类型;

2,一经创建长度固定;

3,可以通过索引(0、1、2......第一个元素从0开始)来找到对应位置的元素。

下面我们来定义和使用数组:

	// 定义一个整型数组,整型数组的意思就是该数组存放的是整型的数据
	// 先声明,一会用
	var arr0 [2]int
	// len函数可以计算数组、切片、map等结构的长度。
	fmt.Printf("len(arr0)= %v\n", len(arr0)) // 长度肯定是0
	// 给arr0数组增加元素:索引为0的位置元素是1,索引为1的位置元素是2
	arr0 = [2]int{1, 2} // 如果设置的元素数量超过2个,则提示Index out of bounds: 2 ,编译都不会通过哦!
	// 看看其中的元素和长度
	fmt.Printf("len(arr0)=%d, arr0: %v\n", len(arr0), arr0)

	// 定义一个长度为3的字符串数组并赋值
	var arr1 = [3]string{"A", "B", "C"}
	fmt.Printf("len(arr1)=%d, arr1: %v\n", len(arr1), arr1)

	// 如果我不想只声明想直接创建好呢?先创建,一会用
	arr2 := [3]string{}
	arr2[0], arr2[1], arr2[2] = "D", "E", "F"
	fmt.Printf("len(arr2)=%d, arr2: %v", len(arr2), arr2)

speed running:

len(arr0)= 2
len(arr0)=2, arr0: [1 2]
len(arr1)=3, arr1: [A B C]
len(arr2)=3, arr2: [D E F]

数组的变更(数组内容、指针等结合)

为避免多余的汉字干扰,这里将相关的解释和分析过程和代码结合起来,以注释的方式直接镶嵌进去,看起来会更清晰和轻快(每个字母都是作者手打,感谢支持):

	// 如果不想赋所有值,先设置其中一部分呢?定义一个长度为3的字符串数组并赋0号位置的值
	var arr3 = [3]string{"A"}
	fmt.Printf("len(arr3)=%d, arr3: %v\n", len(arr3), arr3)
	// 设置索引为1的位置的元素
	arr3[1] = "B"
	fmt.Printf("len(arr3)=%d, arr3: %v\n", len(arr3), arr3)
	//arr3[3] = "D"  // 超出数组边界设置,编译不会通过:Invalid array index 3 (out of bounds for 3-element array)

	// 现在有一个长度为3的字符串数组arr4
	var arr4 = [3]string{"A", "B", "C"}
	// 我们直接赋给arr3,arr3的全部数据变为arr4的数据
	arr3 = arr4 // 假设arr4长度设置为2: var arr4 = [3]string{"A"} 则会提示Cannot use 'arr4' (type [2]string) as type [3]string 编译不能通过
	fmt.Printf("len(arr3)=%d, arr3: %v\n", len(arr3), arr3)

	// 现在有一个arr5,它指向着arr3的内存地址
	arr5 := &arr3
	// 先看看arr5是什么样、它俩的内存地址以及判断是否相等
	fmt.Printf("len(arr5)=%d, arr5: %v, %p,%p, arr3==arr5: %v\n", len(arr5), arr5, &arr3, arr5, arr3 == *arr5)
	// 结果毫无悬念,数据相同,并且arr5保存的地址和arr3指向的地址完全一致,这里要重点注意说辞哦,&arr5和&arr3并不相同。
	// 关于arr3 == *arr5,两者数据和数据类型(长度)完全相同(都引用的是同一快内存的数据),因此==判断为true

	// 此种情况下,我们尝试修改arr5的2号元素的值为new试试
	arr5[2] = "new"
	fmt.Printf("len(arr5)=%d, arr5: %v\n", len(*arr5), *arr5) // 注意,这里直接打印arr5也是能直观看到结果的
	fmt.Printf("len(arr3)=%d, arr3: %v\n", len(arr3), arr3)   // len(arr3)=3, arr3: [A B new] 两者的索引为2位置的元素均被修改

相信看完上述举例和对应分析,你几乎都知道结果啦,一块展示出来:

len(arr3)=3, arr3: [A  ]
len(arr3)=3, arr3: [A B ]
len(arr3)=3, arr3: [A B C]
len(arr5)=3, arr5: &[A B C], 0xc000076480,0xc000076480, arr3==arr5: true
len(arr5)=3, arr5: [A B new]
len(arr3)=3, arr3: [A B new]

数组指针 and 指针数组

关于数组指针、指针数组这两个概念,许多童鞋会被迷惑,实际就是字面意思并不复杂。

数组指针:你有一个数组,数组指针就是这个数组的指针;

指针数组:你有一个数组,数组内存储的元素都是指针类型的数据。

下面我们同样以典型的案例来予以说明:

	arr0 := [2]int{1, 2}
	// &arr0就是数组的指针,即数组指针,得到的结果就是一个指针地址
	fmt.Printf("%p\n", &arr0)

	var a, b = 1, 2
	// arr1存储的是两个int类型变量的地址
	arr1 := []*int{&a, &b}
	fmt.Printf("%v\n", arr1) // 其每个元素就是指针地址,并不是真正的数据

	// 那像arr1这种如何看到真实数据呢?
	// 只看其中某个元素,如索引为0的元素时
	fmt.Printf("%v\n", *arr1[0])

	// 得到arr1的所有数据时
	for i, data := range arr1 {
		fmt.Printf("index=%v, data=%v, addr=%v\n", i, *data, data)
	}

speed running:

0xc0000180b0
[0xc000018098 0xc0000180e0]
1
index=0, data=1, addr=0xc000018098
index=1, data=2, addr=0xc0000180e0

到这里,你应该豁然开朗了哦。

下文我们继续看看数据的其它特征,以及切片的玩法。


http://lihuaxi.xjx100.cn/news/1085100.html

相关文章

华为OD机试 - 羊、狼、农夫过河(Python)

题目描述 羊、狼、农夫都在岸边,当羊的数量小于狼的数量时,狼会攻击羊,农夫则会损失羊。农夫有一艘容量固定的船,能够承载固定数量的动物。 要求求出不损失羊情况下将全部羊和狼运到对岸需要的最小次数。 只计算农夫去对岸的次数,回程时农夫不会运送羊和狼。 备注:农夫…

计算机网络知识复习

目录 TCP/IP协议群做了哪些事情? TCP协议为什么是3次握手,4次挥手? 如果网络延迟是30ms,那么Ping(基于UDP的)一个网站需要多少ms? 如果请求一个HTTP协议的网站,TTFB至少ms? CDN更换图片&am…

趣说数据结构(练习1) —— 顺序表/链表力扣刷题

练习 1 —— 顺序表/链表力扣刷题 1. 合并两个有序链表 力扣题目地址:https://leetcode.cn/problems/merge-two-sorted-lists/ 问题描述:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#x…

尚融宝26-投标

目录 一、需求 (一)投资人投标 (二)流程 二、标的详情 (一)需求 (二)后端 (三)前端 三、计算收益 (一)四种还款方式 &#…

(数学知识)试除法判断质数,分解质因数,埃式与线性筛质数

质数 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 试除法判定质数 你会发现如果说一个数要分成两个数相乘的话,那么这两个数肯定都是成对出现的,有一大一小的相对关系。因此不需要从2遍历到n,循环的…

深入与浅谈 Vue 中计算属性和侦听器的区别和使用(Vue3版本为例)

#五一技术创作马拉松# 📋前言 计算属性 computed 和侦听器 watch 都是 Vue.js 框架中用来响应式更新视图的重要概念。在 Vue 项目开发中,这两个技术点是非常重要的,同时也是 Vue 基础中不可缺少的知识点。在面试中,计算属性 comp…

2022年新能源汽车专题讲座

2022年新能源汽车专题讲座 单选题(共5题,每题6分) 1、《中华人民共和国数据安全法》自()起施行。 正确答案:C、2021年9月1日 2、典型的智能汽车结构主要分为()个层次。 正确答案…

《Effective Python 编写高质量Python代码的59个有效方法》学习笔记6(完)

用functools.wraps定义函数修饰器 python为修饰器提供了专门的语法,它使得程序在运行的时候,能够用一个函数来修饰另一个函数 对于调试器这种依靠内省机制的工具,直接编写修饰器会引发奇怪的行为 内置的functools模块提供了名为wraps的修饰器…