1. 使用go启动一个协程的时候,需要保证整个进程结束前协程能够执行结束,否则没等协程执行结束就退出,会造成很多问题。
2. go的panic为导致整个进程的推出,用go做服务时,注意需要有一个自动重启的服务的脚本。
3. go的map类型是不支持并发读写的,1.9版本以上可以使用sync.Map代替,1.9以下可以自己控制读写锁。
4. go的map相互赋值a:=b,b如果是map类型,则a是b的指针引用,改变a的值事同时也会改变b的值。所以复制一个map是不能直接赋值的。
5. 断言注意类型,不然也会导致程序panic。
6. 切片,map使用应该都要进行内存分配,比如
var m map[string]string
// m := map[string]string{} 正常
// m := make(map[string]string) 正常
m["d"] = "1"
这样会抛出panic: assignment to entry in nil map.
7. 断言switch语句的不能直接强制类型转换,如:
package main
import (
"fmt"
"reflect"
)
func main() {
var m interface{}
m = float64(10)
fmt.Println(reflect.TypeOf(m))
switch n := m.(type) {
case int,float64:
fmt.Println(reflect.TypeOf(n))
fmt.Println(n == 10) //这里float64是不等于10的,各语言都有这样的坑,避免不了
fmt.Println(int(n) == 10) //然后我们想到强制转换,然而这样编译器不通过cannot convert n (type interface {}) to type int: need type assertion
// 当然你去掉case 的int也是不行的
}
}