CLI 命令行实用程序开发实战 - Agenda
文章目录
本次项目主要是使用 cobra/pflag 等工具实现一个 Agenda 应用程序。在这里主要记录一些在实现过程中学习到的 Go 语言的使用技巧,相信这些技巧可以让你的工作事半功倍。
数组与切片
数组
定义数组时,必须指定数组长度。一些常规的定义方法:
var a [100]byte // 长度为5的数组,每个元素为一个字节
var b [100 * N] struct {x, y int} //复杂类型数组
var c [100]*int // 指针数组
var d [100][2]int //二维数组
var e [2][3][4]int //等同于[2]([3]([4]int))
也可以不指定数组长度,而使用...
代替,数组将自动获取初始化变量的个数:
b := [...]int{1, 2, 3}
Go 中的数组是值类型
与 C 很不同的的一点就是,Go 中的数组并不是引用类型,而是值类型。所以当你传递一个数组名给一个函数时,你实际上获得的是数组的拷贝,因此对数组进行的修改实际上都是对形参的修改。
数组指针与指针数组
指针数组指的是这个数组存的是指针:
a, b := 1, 2
p := [2]*int{&a, &b}
数组指针指的是指向数组的指针:
a := [5]int{3, 1, 5, 6, 3}
var p *[5]int
p = &a
使用 range 访问数组
Go 中可以通过下标访问数组中的元素,还提供了一种使用 range 访问数组元素的简便方法:
for i, v := range arr {
fmt.Println(i, v)
}
range具有两个返回值,第一个返回值i是元素的数组下标,第二个返回值v是元素的值。
切片
因为数组是固定长度的,所以在 Go 中使用的比较少,更多的是使用切片(Slice)。它与数组的最大区别就是:Slice是变长的。
Slice包含三个元素:指针、长度(length)、容量(capacity)。指针指向Slice的第一个元素,长度是目前Slice里面的元素个数,容量是Slice最多能容纳元素个数。capacity大于等于length。可以使用函数len和cap获取一个Slice的长度和容量。使用下标访问时不能超过其容量,否则会panic。
空切片也是切片
与map不同,尚未分配的切片也是可以用的:
- 一个nil切片的长度和容量都是0;
- 你可以append到一个空切片,Go会自动分配;
- 你也可以直接迭代一个空切片
但是当判断一个Slice是不是空(empty)的时候,要判断len(s) == 0
,而不是s == nil
。
一个切片就是一个指向数组的指针。
对同一个数组重新切片,实际上就是对相同的底层数组创建了一个新的指针,新的指针具有不同的起始偏移量和切片长度。因此如果通过一个切片对数组进行了修改,相应的修改同样也会反映到另切片中