学习资料来自
GitHub - unknwon/the-way-to-go_ZH_CN: 《The Way to Go》中文译本,中文正式名《Go 入门指南》
1、标签🏷️
1)goto,continue,break(可跳出多重循环)都可以配合标签使用
2)标签和goto并不推荐使用
2、函数
1)不允许函数重载,无范型
2)函数可赋值给变量,本身属于一等值
3)以函数为值的变量可以互相比较,指向同一函数签名/nil的变量视为相等
4)不允许在函数内声明函数(匿名函数除外)
5)参数默认使用按值传递(传递值的拷贝)
6)允许可变长参数
func Greeting(prefix string, who ...string)
Greeting("hello:", "Joe", "Anna", "Eileen")
7)变长参数类型不确定时可引入空接口
func typecheck(..,..,values … interface{}) {
for _, value := range values {
switch v := value.(type) {
case int: …
case float: …
case string: …
case bool: …
default: …
}
}
}
8)defer:多个时逆序执行,类似栈,先进后出。可辅助函数追踪
9)内置函数总结
10)函数本身可作为参数使用
11)关于闭包函数:声明在函数中的函数
闭包函数可辅助进行调试
where := func() {
_, file, line, _ := runtime.Caller(1)
log.Printf("%s:%d", file, line)
}
where()
// some code
where()
// some more code
where()
# —————————————————————————————————————————
var where = log.Print
func func1() {
where()
... some code
where()
... some code
where()
}
12)函数执行时间计算(保存计算过的数值在内存中能有效降低运行时间)
start := time.Now()
longCalculation()
end := time.Now()
delta := end.Sub(start)
fmt.Printf("longCalculation took this amount of time: %s\n", delta)
3、数组和切片
1)各种初始化,数组声明需指定长度,切片不需要
var arrAge = [5]int{18, 20, 15, 22, 16}
var arrLazy = [...]int{5, 6, 7, 8, 22}
var arrLazy = []int{5, 6, 7, 8, 22} //注:初始化得到的实际上是切片slice
var arrKeyValue = [5]string{3: "Chris", 4: "Ron"}
var arrKeyValue = []string{3: "Chris", 4: "Ron"} //注:初始化得到的实际上是切片slice
2)大数组为函数参数时,可通过传递指针降低内存使用
3)切片是引用,共享存储
4)内存分配区别
- new(T) :为类型T分配内存+初始化为0,返回指针
- make(T) :返回类型T的初始值,仅针对map,切片,channel
5)buffer :读写长度未知的 bytes ,初始化方法如下
- var buffer bytes.Buffer
- var r *bytes.Buffer = new(bytes.Buffer)
- func NewBuffer(buf []byte) *Buffer
- 追加字符串方法:buffer.WriteString(s)
- buffer 转为字符串:buffer.String()
6)切片复制,追加
(1)复制:func copy(dst, src []T) int(src拷贝到dst + 返回拷贝的元素个数)
(2)追加:func append(s []T, x ... T) []T(0 个或多个具有相同类型 s 的元素追加到切片后面,返回新的切片),append包含如下操作
- 切片 b 的元素追加到切片 a 之后 :a = append(a, b...)
- 删除位于索引 i 的元素 :a = append(a[:i], a[i+1:]...)
- 切除切片 a 中从索引 i 至 j 位置的元素 :a = append(a[:i], a[j:]...)
- 为切片 a 扩展 j 个元素长度 :a = append(a, make([]T, j)...)
- 索引 i 的位置插入元素 x :a = append(a[:i], append([]T{x}, a[i:]...)...)
- 索引 i 的位置插入长度为 j 的新切片 :a = append(a[:i], append(make([]T, j), a[i:]...)...)
- 索引 i 的位置插入切片 b 的所有元素 :a = append(a[:i], append(b, a[i:]...)...)
- 取出位于切片 a 最末尾的元素 x :x, a = a[len(a)-1], a[:len(a)-1]
- 元素 x 追加到切片 a :a = append(a, x)