注:本文搬运了一些我青训营期间听课的笔记(我一般直接用注释或者记笔记本上),不保证正确性,而且有些地方可能比较乱,大家看个乐就行了。
基础语法部分
slice
go的slice可近似理解为可变长度的数组,长度可以随时更改,由于这一特性slice也比数组在实际业务中用的更多。
go中slice的原理是存储了“长度+容量+一个指向数组的指针”,如果出现容量不够,会扩容并返回一个新的slice。
运用make函数可以创建slice,其用法可以参考官方的描述:
For example, make([]int, 0, 10) allocates an underlying array of size 10 and returns a slice of length 0 and capacity 10 that is backed by this underlying array.
从这个描述中可以看出除了直观的length外,go的slice还有一个capacity(隐藏在length之下)的概念,而且capacity不小于length。
在第22行可以看到go也有类似python的切片操作,涵盖范围为“方括号内前包后不包”,但与python不同的是go的切片不支持负数索引,如果要用“倒数第n个数”的话要用len取出长度再加以运算。
package main
import "fmt"
func main() {
s := make([]string, 3) // 创建一个切片,给出元素类型和长度
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) // c // 同一行输出时中间自动带一个空格
fmt.Println("len:", len(s)) // 3
s = append(s, "d") // 在切片后面增加元素,注意必须把append赋值给原切片
s = append(s, "e", "f") // 可以增加多个元素
fmt.Println(s) // [a b c d e f]
c := make([]string, len(s))
copy(c, s) // 在两个slice之间拷贝数值
fmt.Println(c) // [a b c d e f]
fmt.Println(s[2:5]) // [c d e] // 类似切片操作
fmt.Println(s[:5]) // [a b c d e]
fmt.Println(s[2:]) // [c d e f]
good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
}