Go 容器之数组和切片
在 Java 的核心库中,集合框架可谓鼎鼎大名:Array
、List
、Set
、Queue
、HashMap
等等,随便拎一个出来都值得开发者好好学习如何使用甚至是背后的设计源码(这类文章也挺多,大家上网随便一搜)。
虽然 Go 语言没有如此丰富的容器类型。
序列容器
序列容器存储特定类型的数据元素。目前有 5 种序列容器的实现:
array
vector
deque
list
forward_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)
}
运行结果如下图:
总结
最后使我们的总结,不管是数据还是切片,它们内部的数据类型必须是一致的(要么都是整型、要么都是字符串类型)
- 点赞
- 收藏
- 关注作者
评论(0)