GO语言基础-2 | 青训营笔记

75 阅读2分钟

注:本文搬运了一些我青训营期间听课的笔记(我一般直接用注释或者记笔记本上),不保证正确性,而且有些地方可能比较乱,大家看个乐就行了。

基础语法部分

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]
}