CLI 命令行实用程序开发实战 - Agenda

CLI 命令行实用程序开发实战 - Agenda

文章目录

  • CLI 命令行实用程序开发实战 - Agenda
    • 数组与切片
      • 数组
        • 定义数组时,必须指定数组长度。一些常规的定义方法:
        • Go 中的数组是值类型
        • 数组指针与指针数组
        • 使用 range 访问数组
      • 切片
        • 空切片也是切片
        • 一个切片就是一个指向数组的指针。

本次项目主要是使用 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{123}

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

一个切片就是一个指向数组的指针。

对同一个数组重新切片,实际上就是对相同的底层数组创建了一个新的指针,新的指针具有不同的起始偏移量和切片长度。因此如果通过一个切片对数组进行了修改,相应的修改同样也会反映到另切片中

你可能感兴趣的:(服务计算)