https://chai2010.cn/advanced-go-programming-book/appendix/appendix-a-trap.html
http://km.oa.com/group/16106/articles/show/304264sql
须要首字母大写才是对外可见的, 这是的对外指的是不一样的 package, 特别须要注意的是 json 解析时的 struct 里面的字段名首字母必须大写, 不然没法解析, 同理还有 toml 配置解析等等json
包内的 init() 函数会在 import 包的时候就执行
执行顺序:app
sql.Open 和 DB.Close 并不能保证链接不泄漏, database/sql 实际上是链接池, Open 以后并不立刻进行链接, 只有实际查询的时候才发起链接.
Query 返回的 Rows 必须 Next 每一行数据才会断开链接, 以后把链接归还到链接池, 没有读完的数据比较手动 Rows.Close 才能保证链接不泄露.函数
// 建议都这么写: v, err := doSth() if err != nil { // 出错了 ... } // 正常的逻辑 ... // 不建议下面这样写 // 缘由是 **__err==nil__** 很容易被误写成 **__err!=nil__**: if v, err := doSth(); err == nil { // 正常的逻辑 ... } else { // 出错了 ... }
// 错误 for i:=0; i < 100; i++ { go func() { fmt.Println(i) }() } // 正确 for i:=0; i < 100; i++ { go func(i int) { fmt.Println(i) }(i) } // 正确 for i:=0; i < 100; i++ { i := i go func() { fmt.Println(i) }() }
须要注意返回指针的函数调用者必定要判断指针是否为 nil
或者写带指针返回值的函数时加一个 error 或者 bool 出参, 这样调用方不得不判断是否逻辑异常, 能够必定程度避免调用方不检查的状况指针
对未初始化的 map 取值正常, 赋值出错code
var m map[int]int if m[5] == 5 { // 正确 ... } m[5] = 5 // 错误
m := make(map[int]map[int]int) m[5][5] = 5 // 错误