基本语法
Go 圣经
常用库
切片
go 通过切片模拟栈和队列
栈
1
2
3
4
5
6
7
8
9
|
// 创建栈
stack := make([]int, 0)
// push压入
stack = append(stack, 10)
// pop弹出
v := stack[len(stack)-1]
stack = stack[:len(stack)-1]
// 检查栈空
len(stack) == 0
|
队列
1
2
3
4
5
6
7
8
9
|
// 创建队列
queue := make([]int, 0)
// enqueue入队
queue = append(queue, 10)
// dequeue出队
v := queue[0]
queue = queue[1:]
// 检查队空
len(queue) == 0
|
注意:默认 s=s[0 : len(s)]
,取下限不取上限,前闭后开,数学表示为:[ )
字典
基本用法
1
2
3
4
5
6
7
8
9
10
|
// 创建
m := make(map[string]int)
// 设置kv
m["hello"] = 1
// 删除k
delete(m, "hello")
// 遍历
for k, v := range m{
println(k, v)
}
|
注意
- map 键需要可比较,不能为 slice、map、function
- map 值都有默认值,可以直接操作默认值,如:
m[age]++
,值由 0 变为 1
- 比较两个 map 需要遍历其中的 kv 是否相同,因为有默认值关系,所以需要检查 val 和 ok 两个值
标准库
sort
1
2
3
4
5
6
7
8
|
// int排序
sort.Ints([]int{})
// 字符串排序
sort.Strings([]string{})
// 自定义排序
sort.Slice(s, func(i, j int) bool {
return s[i] < s[j] // 小的在前,升序
})
|
math
1
2
3
4
5
6
|
// int32 最大最小值
math.MaxInt32 // 实际值:1<<31-1
math.MinInt32 // 实际值:-1<<31
// int64 最大最小值(int默认是int64)
math.MaxInt64
math.MinInt64
|
copy
1
2
3
4
5
6
7
8
9
10
|
// 删除a[i]: 用 copy 将i+1到末尾的值前移一个单位,然后更新长度
copy(a[i:], a[i+1:])
a = a[:len(a)-1]
// make创建切片时指定具体长度,则通过索引赋值
a := make([]int, n)
a[0] = x
// make创建切片时指定长度为0,则通过append()追加元素
a := make([]int, 0)
a = append(a, x)
|
常用技巧
类型转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
s = "12345" // s[0] 类型是byte(字符串通过索引下标访问的字符是字节型)
num := int(s[0] - '0') // 1 (byte -> int)
b := byte(num + '0') // '1' (int -> byte)
str := string(s[0]) // "1" (byte -> string)
b := byte(str) // '1' (string -> byte)
bs := []byte(s) // ['1', '2', ... , '5'] (string -> []byte)
str := string(bs) // "1" ([]byte -> string)
// 字符串 <-> 数字
num, err := strconv.Atoi() // 字符串转数字可能会失败
str := strconv.Itoa() // 数字 -> 字符串
|
刷题注意点
- leetcode 中,全局变量不要当做返回值,否则刷题检查器会报错
- 全局变量需要在函数体中重新初始化,不然变量值会在下一用例中继续使用