IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Golang 数据结构之 Slice (一) -> 正文阅读

[数据结构与算法]Golang 数据结构之 Slice (一)

Golang 数据结构之 Slice

前言

Slice(切片)是抽象在 Array(数组)之上的特殊的数据类型类型,在了解slice之前需要先了解一下Array的情况。

Array 数组

Array数组就是 Golang 的基本数据类型中的数字,是一种顺序存储结构。

用法

func main() {
	nums := [4]int{}
	nums[0] = 1
	nums[2] = 3

	fmt.Printf("nums: %v\n", nums)
	fmt.Printf("nums[2]: %d\n", nums[2])
}

输出结果
在这里插入图片描述

数据结构

在使用的时候需要指定长度和存储元素类型。数组在声明后,其元素的初始值(也就是零值)为 0。并且该变量可以直接使用,不需要特殊操作。底层数据存储为一段连续的内存空间,通过固定的索引值(下标)进行检索。
在这里插入图片描述
需要注意的是数组的长度是固定的,它的长度是类型的一部分,因此 [3]int 和 [4]int 在类型上是不同的

Slice 切片

Slice 是对 Array 的抽象,Slice 和 Array 不一样,它不需要指定长度。使用更加的灵活,能够自动扩容。

用法

func main() {
	nums := [4]int{}
	nums[0] = 1
	nums[2] = 3

	slice := nums[:]

	fmt.Printf("slice: %v", slice)
}

输出结果为
在这里插入图片描述

数据结构

它的存储结构这样的,共分为三部分

  • array:指向所引用的数组指针,可以说任意元素的指针
  • len:长度,当前引用切片的元素个数
  • cap:容量,当前引用切片的容量(底层数组的元素总数)
    在这里插入图片描述
    在上述代码中,可观察到 slice := nums[:],这行代码初始化了 Slice 的 Pointer 指向数组, len 和 cap 都为数组的基础属性,及长度为 4 。

len != cap

len 可以不等于 cap,但必须大于或等于 len,否则会导致 panic

func main() {
	nums := [4]int{}
	nums[0] = 1
	nums[2] = 3

	slice := nums[0:3]
	fmt.Printf("slice: %v, len: %d, cap: %d", slice, len(slice), cap(slice))
}

在这里插入图片描述数据结构是这样的,只取了 nums 的三个元素的指针
在这里插入图片描述

  • len 为所引用元素的个数;
  • cap 为所引用的数组元素总个数。

另外一种创建方式

创建切片除了上面的方式,还有另外一种不常见的方式,我们简单看一下源码

// MakeSlice creates a new zero-initialized slice value
// for the specified slice type, length, and capacity.
func MakeSlice(typ Type, len, cap int) Value {
	if typ.Kind() != Slice {
		panic("reflect.MakeSlice of non-slice type")
	}
	if len < 0 {
		panic("reflect.MakeSlice: negative len")
	}
	if cap < 0 {
		panic("reflect.MakeSlice: negative cap")
	}
	if len > cap {
		panic("reflect.MakeSlice: len > cap")
	}

	s := unsafeheader.Slice{Data: unsafe_NewArray(typ.Elem().(*rtype), cap), Len: len, Cap: cap}
	return Value{typ.(*rtype), unsafe.Pointer(&s), flagIndir | flag(Slice)}
}
  • 判断传入的 Slice 类型是否合规;
  • 判断 len ,cap 是否合规,检查 cap 是否大于 len;
  • 返回申请成功的 Slice 内存地址和相关属性。
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:44:27  更:2022-05-05 11:44:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:51:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码