Golang小记
Go 学习中遇到的难点
Golang小记
小记
cap
- cap() 是专门用来测量“容器”的工具,只适用于三种容器类型
- 切片(slice)
- 数组(array)
- 通道(channel)
slice
声明定义
- []type{}
- make ([]type, len)
- make ([]type, len, cap)
首尾初始化
规则:
- 自动补零
- string -> “”
- bool -> false
- *int -> nil
- 长度和容量相同
索引不允许出现重复初始化
s1 := []int{0, 1, 3, 8: 100}- 含义:8: - 初始化到索引8 - 除首部初始化值外,填充0 - 尾部,即索引8 填充 100
- 易错点
1
2
3
err1 := []int{0, 1, 1:5} // 索引1 重复初始化,报错
err2 := []int{3:1, 2:2} // 索引越界,但允许,初始化顺序不影响结果
基本操作
slice []type := ...- s是一个数组或切片
- s[:] //从0 到 len(s) - 1 的切片, 即所有长度的切片
- s[low:] //从 low 到 len(s)的切片
- s(:high) //从 0 到 high - 1的切片
- s(low:high:max) // 从 low 到 high - 1的切片,容量为 max - low
切片的追加append
规则:
- 超出原 slice.cap 限制,会触发重新分配底层数组,即使原数组未填满
- 如: s := data[:2:2] 超出 容量2 就会重新分配原数组
- 容量重分配规则: 新分配容量是原容量的2倍
- 追加元素
- append(slice, 4, 2)
- 追加完整切片
- append(slice, slice0)
- 追加部分切片的元素
- append(slice, slice0[start:end])
切片拷贝
copy(dest_slice, copy_slice)
- 允许切片指向同一底层数组、元素区间重叠的情况
- 拷贝以 len 长度小的为准
切片resize 调整大小
- 通过再次赋值,赋予不同大小
- 需要注意越界问题
1
2
3
var a = []int{1, 3, 4, 5}
b := a[1:2]
c := b[0:3]
结构体
- 结构体与json序列化
- 结构体标签
流程控制
if
- 类型断言
- ```go if s, ok := x.(string); ok{
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
##### 执行流程
- .(string) 检查x的动态类型是否能转为 string
- 若不匹配
- ok = false
- s 获得 `string` 的零值 空字符串 ""
- 跳过代码段
- 若匹配
- ok = true
- s 获得 x 底层的字符串值
- 执行 {} 内的代码
* 多返回值
*
```go
if val, err := obj.func(); err{}
switch
- 多值判断
- 不限制类型
- 能判断变量的类型
循环语句for和range
- for的用法
1 2 3
for init; condition; post for condition for {}//无限循环
- range
- ```go //一般用法 for index, value := range collection {}
//对于 map for key, value := range map {}
//对于 通道 chan for value := range chan ()
1
2
3
4
5
6
7
8
9
10
11
12
### 函数
#### 参数
* 不定参数传值
*
```go
//本质上是切片
func mfunc(args ...int) //0个或多个参数
func mfunc(a int, b int, args ...int) int //两个或多个参数
// 传递任意类型的管理 使用 interface{}
func mfunc(args ...interface{})
示例:
1
2
3
func test(s string, n ...int) string {
for _, i := range n{}
}
- 使用 slice 对象作为变参传参时需要展开 (slice…)
- 示例:
1 2 3 4 5
func test(s string, n ...int) string{} func main(){ s := []int{1,2,3} t := test("123", s...) // slice... 展开slice }
返回值
- 隐式返回和显式返回
- 可多值返回
闭包
- 记住创建时的环境,会保留非传参变量的变化
- 同个函数中创建出的多个闭包,可以相互影响
This post is licensed under CC BY 4.0 by the author.