Go - 切片:初学者的动态数组指南

你好,未来的Go程序员们!今天,我们将深入了解Go语言中最灵活、最强大的数据结构之一:切片。可以把切片看作是Go编程中的瑞士军刀——它们灵活、高效,一旦你掌握了它们,你会想知道没有它们你以前是如何编程的!

Go - Slice

什么是切片?

在我们开始之前,先来介绍一下背景。想象你在计划一个派对(当然是编码派对!)。你需要一份宾客名单,但你不确定会有多少人参加。这就是切片大显身手的地方!它们就像是可以根据需要增长或缩减的动态宾客名单。

在Go中,切片是对数组的灵活、动态的视图。它就像是一扇可以调整大小的窗户,允许你只处理数组的一部分,甚至可以即时创建一个全新的数组。

定义切片

让我们开始创建我们的第一个切片。有多种方法可以做到这一点,我们逐一探讨。

方法1:使用make()函数

guestList := make([]string, 3)
fmt.Println(guestList) // 输出: [  ]

在这个例子中,我们创建了一个初始长度为3的字符串切片。这就像是为我们的派对设置了三把空椅子。make()函数就像我们的派对策划者,为我们准备宾客的空间。

方法2:切片字面量

guestList := []string{"Alice", "Bob", "Charlie"}
fmt.Println(guestList) // 输出: [Alice Bob Charlie]

在这里,我们创建了一个切片并立即填入了宾客。这就像是有了一个准备好的VIP名单!

方法3:从现有数组切片

partyRoom := [5]string{"Alice", "Bob", "Charlie", "David", "Eve"}
vipGuests := partyRoom[0:3]
fmt.Println(vipGuests) // 输出: [Alice Bob Charlie]

在这种情况下,我们从一个现有的数组创建了一个切片。这就像是从我们的派对室中选择前三个人加入VIP名单。

len()和cap()函数

现在我们有了宾客名单,让我们来谈谈两个重要的函数:len()cap()

guestList := make([]string, 3, 5)
fmt.Printf("长度: %d, 容量: %d\n", len(guestList), cap(guestList))
// 输出: 长度: 3, 容量: 5
  • len()告诉我们当前名单上有多少宾客。
  • cap()告诉我们名单在需要扩展之前可以容纳多少宾客。

len()想象成当前设置的椅子数量,而cap()则是派对室中可用的椅子总数。

空切片

有时,你可能声明了一个切片但没有初始化它。这称为空切片。

var emptyList []string
fmt.Println(emptyList == nil) // 输出: true

空切片就像是有了一个宾客名单的想法,但还没有真正创建名单。这是完全有效的,在某些情况下很有用!

子切片

子切片就像在你的派对中创建一个VIP区域。你可以选择现有切片的一部分来创建一个新的切片。

fullGuestList := []string{"Alice", "Bob", "Charlie", "David", "Eve"}
vipGuests := fullGuestList[1:4]
fmt.Println(vipGuests) // 输出: [Bob Charlie David]

在这里,我们从索引1到3(记住,结束索引是排他的)选择宾客作为我们的VIP。

append()和copy()函数

append()

append()函数就像是有了一个保安,可以向你的派对中添加新宾客。

guestList := []string{"Alice", "Bob"}
guestList = append(guestList, "Charlie")
fmt.Println(guestList) // 输出: [Alice Bob Charlie]

你甚至可以一次性添加多个宾客:

guestList = append(guestList, "David", "Eve")
fmt.Println(guestList) // 输出: [Alice Bob Charlie David Eve]

copy()

copy()函数就像是有了一个派对策划者,可以将你的宾客名单复制一份。

originalList := []string{"Alice", "Bob", "Charlie"}
newList := make([]string, len(originalList))
copiedElements := copy(newList, originalList)
fmt.Printf("复制了 %d 个元素。新名单: %v\n", copiedElements, newList)
// 输出: 复制了 3 个元素。新名单: [Alice Bob Charlie]

切片方法表

以下是我们讨论过的关键切片方法的便捷表格:

方法 描述 示例
make() 创建一个切片 make([]int, 5)
len() 返回切片的长度 len(slice)
cap() 返回切片的容量 cap(slice)
append() 向切片添加元素 slice = append(slice, 1, 2, 3)
copy() 从一个切片复制元素到另一个切片 copy(destSlice, sourceSlice)
子切片 从现有切片创建一个新的切片 newSlice := slice[1:4]

就这样,朋友们!你已经迈入了Go切片奇妙世界的第一步。记住,熟能生巧,所以不要害怕尝试这些概念。创建你自己的派对宾客名单,玩转添加和复制,很快你就能像专业人士一样切片和切丁Go代码!

快乐编码,愿你的切片总是完美地满足你的需求!

Credits: Image by storyset