开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:github.com/weopenproje…
上一章,介绍了数组 array 以及它灵活的好兄弟切片 slice。这一章,继续介绍 slice 的一些打手小弟——功能函数。
先介绍下空切片 nil slice:
package main
import "fmt"
func main() {
var s []int // 定义一个空切片
fmt.Println(s, len(s), cap(s)) // 长度和容量都是 0
if s == nil {
fmt.Println("nil!")
}
}
使用 make 函数来构造切片 slice:
package main
import "fmt"
func main() {
a := make([]int, 5) // 构造一个长度为 5,用 0 填充的切片
printSlice("a", a)
b := make([]int, 0, 5) // 构造一个长度为 0,容量为 5 的切片
printSlice("b", b)
c := b[:2] // 使用 [:] 语法构造切片,不改变容量
printSlice("c", c)
d := c[2:5] // 使用 [:] 语法构造切片,改变容量
printSlice("d", d)
}
func printSlice(s string, x []int) {
fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x)
}
使用 append 函数来为切片添加元素:
package main
import "fmt"
func main() {
var s []int // 构造一个空切片,这时长度容量都为 0
printSlice(s)
s = append(s, 0) // 依次添加元素,观察长度和容量的变化
printSlice(s)
s = append(s, 1)
printSlice(s)
s = append(s, 2, 3, 4)
printSlice(s)
s = append(s, 2, 3, 4)
printSlice(s)
}
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
在给一个空切片添加元素时,go 会自动对切片进行扩容,以接收未来更多元素。感兴趣的朋友可以去搜索下相关文章,了解下扩容的算法,看看语言的设计者们怎么设计扩容算法,来达到性能与实用的平衡。
使用 range 函数来遍历数组或切片:
package main
import "fmt"
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
func main() {
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
}
range 可以获取索引的同时还获得对应元素的值,是很方便的开发工具。
ok,上面介绍了三个切片的好帮手,可以帮助我们更好的操作使用切片。下一章,我们讲下 go 的哈希表——Map。这在任何编程语言中,都是非常重要的数据结构~