《go语言趣学指南》学习笔记
· 阅读需 9 分钟
命令式编程
格式化输出
%v
:默认格式打印%b
:以二进制格式打印整数%f
:浮点数打印。%05.2f
表示宽度为5,精度为2,前面补0。%c
:打印Unicode字符%s
:以字符串打印%[1]v
:以默认格式打印第1个参数。参数索引以1开始。
循环和分 支
// if语句
if 条件1 {
} else if 条件2 {
} else {
}
// switch语句
switch 变量 {
case 值1: 表达式1
case 值2: 表达式2
default: 表达式3
// switch语句不需要加break,默认不执行下一分支的代码
// 如果要执行下一分支的代码,使用 fallthrough 关键字
// 循环
for 条件 {
}
for i := 0; i < 10; i++ {
}
类型
big
包:大数
rune
:支持Unicode的字符类型
转换布尔值:布尔值没有相等的数字值或字符串值,不能与数字或字符串直接转换。
构建块
函数声明:
func Intn(n int) int {
// ...
}
方法声明:
func (k kelvin) celsius() celsius {
// ...
}
变量可以指向函数,函数也可以作为参数传递给其他函数。
匿名函数可以赋值给变量,然后像使用其他函数那样使用那个变量。匿名函数是闭包的。
收集器
数组
// 数组的定义
var planets [8]string // 未被赋值的元素初始化为零值。string的零值:空字符串
dwarfs := [5]string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"}
dwarfs := [...]string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"}
// 数组的遍历
for i := 0; i < len(dwarfs); i++ {
dwarf := dwarfs[i]
}
for i, dwarf := range dwarfs {
fmt.Println(i, dwarf)
}
数组赋值给新变量或传递给函数,都会产生一个完整的副本,因此函数一般使用切片而不是数组作为形参。
切片
切片是左闭右开,如planets[0:4]
包括索引0不包括索引4。
// 创建切片
dwarfs := []string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"}
// 字符串切片排序
sort.StringSlice(planets).Sort()
sort.Strings(planets)
// 添加元素
dwarfs = append(dwarfs, "Orcus", "Sedna")
// 切片长度
len(slice)
// 切片容量
cap(slice)
如果底层数组没有足够的空间用于切片的append
,会创建原数组2倍容量的新数组。使用三索引切片可以指定容量。
使用make
创建切片:
s1 := make([]string, 5, 10) // 创建长度为5,容量为10的切片
s2 := make([]string, 5) // 创建长度为5,容量为5的切片
可变函数参数:
func terraform(prefix string, worlds ..string) []string { // worlds是字符串切片
映射
// 声明map并赋初值
temperature := map[string]int{
"Earth": 15,
"Mars": -65,
}
// map取不存在的key时,返回零值
// 为了区分不存在该key与存在该key但值为0的情况,使用第2个参数
// ok为true时表示key存在,为false时表示key不存在
moon, ok := temperature["Moon"]
// 使用make对映射实行预分配
make(map[float64]int, 8)
映射在赋值或传参时传递的是引用而不是副本。