长安链 DApp 开发必学 Go 04

98 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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。这在任何编程语言中,都是非常重要的数据结构~