浅析Go语言容器之数组和切片的使用
亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《浅析Go语言容器之数组和切片的使用》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下语言数组、切片,希望所有认真读完的童鞋们,都有实质性的提高。
在 Java 的核心库中,集合框架可谓鼎鼎大名:Array 、List、Set、Queue、HashMap 等等,随便拎一个出来都值得开发者好好学习如何使用甚至是背后的设计源码(这类文章也挺多,大家上网随便一搜)。
虽然 Go 语言没有如此丰富的容器类型,但也有一些基本的容器供开发者使用,接下来让我们一一认识这些容器类型吧。
序列容器
序列容器存储特定类型的数据元素。目前有 5 种序列容器的实现:
arrayvectordequelistforward_list
这些序列容易可以用顺序的方式保存数据,利用这些序列容易能够编写有效的代码,重复使用标准库的模块化。
数组
Go 语言中的数组类型有点类似 C++ 中的数据,Go 的数组初始化定义后,在编译时就不会再变更。
定义数组的方式如下:
var a [10]int
b := [5]string {"H", "e", "l", "l", "o"}
[n]T 类型就表示含有 n 个类型为 T 的数组,本例中就是 a 变量表示含有 10 个 int 类型的整型数组;b 变量表示含有 5 个 string 类型的字符串数组。 数组的长度作为其类型的一部分,因此数组的长度是无法调整的。
package main
import "fmt"
func main() {
var a [10]int
a[0] = 2022
a[1] = 2023
fmt.Println(a[0], a[1])
fmt.Println(a)
b := [5]string {"H", "e", "l", "l", "o"}
fmt.Println(b)
}
运行结果如下:

Vector
你可能会好奇,Go 语言又没有 C++ 中的 Vector 类型,为什么会举出这个例子。
其实 Go 最初有一个 Vector 类型的实现,但在 2011 年 10 月 11 日,在 Go 语言的开发阶段被删除了。保留了现在的切片,而切片就变成了实际上更好的 Vector 实现。
一个数组有固定的大小,但切片是一个动态、灵活的数组元素的视图,在实际中,切片比数组更为常见。
[]T 表示是一个具有类型 T 的元素切片,[]byte 是 byte slice,指元素为 byte 的 slice;[]string 是 string slice,指元素为 string 的 slice。
切片通过指定两个切点 a[low : high],可以定义如下的 sliceExample 切片:
sliceExample := []string{"Say", "Hello", "to", "you"}
切片对比数组的最大优点就是:可以随着增加和删除来增加或减少容器的大小。我们来看一个例子:
package main
import "fmt"
// remove i indexed item in a slice
func remove(s []string, i int) []string {
copy(s[i:], s[i+1:])
return s[:len(s)-1]
}
func main() {
primes := [6]int{2, 3, 5, 7, 11, 13}
var s []int = primes[1:4]
fmt.Println(s)
sliceExample := []string{"Say", "Hello", "to", "you"}
sliceExample = append(sliceExample, ",My Gopher Friends~")
fmt.Println("Append Slice: ", sliceExample)
sliceExample = remove(sliceExample, 0)
fmt.Println("After Removed Item: ", sliceExample)
}
运行结果如下图:

我们分享了 Go 语言提供的容器中的数组和切片,不管是数据还是切片,它们内部的数据类型必须是一致的(要么都是整型、要么都是字符串类型)。但数据的大小是固定,而切片可以根据元素的添加和减少动态调整容器大小。
Deque
Deque,即双端队列,是一个可以扩展的容器。扩展可以发生在容器的前面或后面。当队列的顶部或尾部需要经常被引用时,经常使用双端队列。
Go 官网有一个双端队列的实现,官方地址点此处。

下面的代码块显示了 Go 双端队列 deque 的使用:
package main
import (
"fmt"
"github.com/gammazero/deque"
)
func main() {
var q deque.Deque[string]
q.PushBack("I")
q.PushBack("love")
q.PushBack("learning")
q.PushBack("Go")
fmt.Println("队列长度为: ", q.Len()) // Prints: 4
fmt.Println("队首为元素:", q.Front()) // Prints: I
fmt.Println("队尾为元素: ", q.Back()) // Prints: Go
q.PopFront() // remove "I"
q.PopBack() // remove "Go"
q.PushFront("Hello")
q.PushBack("World")
// Consume deque and print elements.
for q.Len() != 0 {
fmt.Println(q.PopFront())
}
}
运行结果如图:

List
List 在 Go 语言中有一个双链表的实现,它位于内置标准库 container/list 包中,官网地址为:https://pkg.go.dev/container/list
我们可以直接使用这个链表的实现:
package main
import (
"container/list"
"fmt"
)
func main() {
// Create a new list and put some numbers in it.
l1 := list.New()
e4 := l1.PushBack(4)
e1 := l1.PushFront(1)
l1.InsertBefore(3, e4)
l1.InsertAfter(2, e1) // now l1 is [1 2 3 4]
// Iterate through list and print its contents.
for e := l1.Front(); e != nil; e = e.Next() {
fmt.Println(e.Value)
}
l1.MoveToBack(e1) // now l1 is [4 2 3 1]
listLength := l1.Len() // length is 4
fmt.Printf("l1 type: %T\n", l1)
fmt.Println("l1 length : :", listLength)
for e := l1.Front(); e != nil; e = e.Next() {
fmt.Println(e.Value)
}
}
运行结果为:
1
2
3
4
l1 type: *list.List
l1 length : : 4
2
3
4
1
单链表
最后介绍一下单链表,如果我们想实现的数据结构并没有标准的容器集成,此时我们就可以通过自己根据要求来写一个自己想要的容器类型,这里以头插法的单链表举例:
package main
import "fmt"
type SinglyLinkedList struct {
head *LinkedListNode
}
type LinkedListNode struct {
data string
next *LinkedListNode
}
func (ll *SinglyLinkedList) Append(node *LinkedListNode) {
if ll.head == nil {
ll.head = node
return
}
currentNode := ll.head
for currentNode.next != nil {
currentNode = currentNode.next
}
currentNode.next = node
}
func main() {
ll := &SinglyLinkedList{}
ll.Append(&LinkedListNode{data: "Hello"})
ll.Append(&LinkedListNode{data: "Gopher"})
for e := ll.head; e != nil; e = e.next {
fmt.Println(e.data)
}
}
运行结果如图:

当然,还有更多的容器方法可以等着自己去扩充,这一部分读者感兴趣可以在算法和数据结构的知识点中进行学习。
总结
本文介绍了 Go 语言的数组和切片类型,接着介绍了 Go 标准包 container 中的 list,最后实现了一个头插法的单链表。如果在日常开发过程中,有什么容器需要使用,可以从 pkg.go.dev/ 进行搜索,会有很多开源的 Go 优秀开源包,无论是学习还是使用,都能收获满满。
好了,本文到此结束,带大家了解了《浅析Go语言容器之数组和切片的使用》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!
详解Golang中gcache模块的基本使用
- 上一篇
- 详解Golang中gcache模块的基本使用
- 下一篇
- Golang如何快速构建一个CLI小工具详解
-
- 不安的面包
- 受益颇多,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢博主分享文章内容!
- 2023-03-13 18:16:36
-
- 悲凉的人生
- 这篇技术文章真及时,细节满满,太给力了,收藏了,关注老哥了!希望老哥能多写Golang相关的文章。
- 2023-03-10 03:03:35
-
- 聪明的眼睛
- 太细致了,mark,感谢作者的这篇技术文章,我会继续支持!
- 2023-02-23 16:51:42
-
- 无聊的画笔
- 赞 ??,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢博主分享技术文章!
- 2023-02-01 14:18:35
-
- 开朗的海燕
- 这篇技术贴真是及时雨啊,博主加油!
- 2023-01-12 17:11:19
-
- 独特的胡萝卜
- 很详细,码起来,感谢作者大大的这篇技术贴,我会继续支持!
- 2023-01-11 16:12:55
-
- 温柔的铃铛
- 这篇文章内容太及时了,好细啊,写的不错,mark,关注up主了!希望up主能多写Golang相关的文章。
- 2023-01-04 15:31:31
-
- 外向的外套
- 受益颇多,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢楼主分享技术文章!
- 2022-12-31 22:09:15
-
- 害羞的夕阳
- 这篇技术文章真是及时雨啊,细节满满,写的不错,收藏了,关注up主了!希望up主能多写Golang相关的文章。
- 2022-12-31 12:29:18
-
- 忧伤的香水
- 这篇文章内容真是及时雨啊,太细致了,很好,码住,关注老哥了!希望老哥能多写Golang相关的文章。
- 2022-12-28 01:46:04
-
- Golang · Go教程 | 1小时前 | go · TLS · Go 1.27 · QUIC · crypto/tls Go 1.27 QUICConfig ClientHelloInfoConn QUIC握手
- Go 1.27 QUIC 握手如何传入连接信息:ClientHelloInfoConn 解决什么问题
- 320浏览 收藏
-
- Golang · Go教程 | 2小时前 | 性能优化 · Go教程 · 数据库驱动 · Go1.27 · 数据库驱动 database/sql Go 1.27 Rows.Scan RowsColumnScanner
- Go 1.27 数据库驱动如何少做一次中转:RowsColumnScanner 直接写入目标值
- 187浏览 收藏
-
- Golang · Go教程 | 4小时前 | Go教程 · Go工具链 · Go测试 · JSON解析 · 测试报告 Go 1.27 go test -json OutputType test2json
- Go 1.27 go test -json OutputType 怎么解析:区分错误、续行与帧
- 266浏览 收藏
-
- Golang · Go教程 | 5小时前 | 标准库 · JSON · Go教程 · Go 1.27 encoding/json/v2 JSON迁移 DefaultOptionsV1
- Go 1.27 JSON v1 与 v2 渐进切换:Options 如何控制兼容语义
- 172浏览 收藏
-
- Golang · Go教程 | 11小时前 | 依赖管理 · Go教程 · Go Modules · Go 1.27 · require go.mod 间接依赖 Go 1.27 go mod tidy 直接依赖
- Go 1.27 go mod tidy 多 require 块怎么整理:直接依赖与间接依赖边界
- 103浏览 收藏
-
- Golang · Go教程 | 11小时前 | Go教程 · go fix · 代码迁移 · Go 1.27 · go fix modernizer Go 1.27 atomictypes embedlit slicesbackward unsafefuncs
- Go 1.27 go fix 怎么挑 modernizer:自动改写前先看四类边界
- 377浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 15次使用
-
- 腾讯扣叮
- 腾讯扣叮是腾讯推出的6-18岁青少年编程学习平台,依托游戏与AI技术,提供图形化编程、3D创作、虚拟实验室及丰富赛事课程,助力培养计算思维与创新能力。
- 13次使用
-
- Framer AI
- Framer AI是一款强大的无代码建站工具,支持通过中文文本描述自动生成、排版并发布响应式网站。目前提供免费无限次生成服务,被评测为效果最佳的AI网站生成器之一,具备智能文案优化及自定义主题功能。
- 7次使用
-
- 轻竹办公
- 轻竹办公是一款由北京智未创想科技推出的AI驱动PPT制作工具。只需输入标题或上传文档,即可在几十秒内自动生成文案、匹配模板并预览效果,支持一键下载pptx文件,适用于工作汇报、学术讲座等多种场景,提供高效便捷的演示文稿解决方案。
- 6次使用
-
- 找我呀
- 找我呀是一款注重隐私安全的本地AI知识助手,支持多格式文件的语义搜索与智能问答。数据仅在本地处理不上传云端,兼容Windows/macOS,助您高效构建个人知识库,实现文档内容的快速检索与分析。
- 14次使用
-
- 浅析Golang切片截取功能与C++的vector区别
- 2022-12-23 496浏览
-
- Golang切片Slice功能操作详情
- 2022-12-31 202浏览
-
- 一文详解Golang中的切片数据类型
- 2022-12-31 171浏览
-
- Go语言里切片slice的用法介绍
- 2022-12-30 276浏览
-
- 详解Go语言中数组,切片和映射的使用
- 2023-01-20 198浏览

