1. 使用uber-go/zap 來印出Log
a. zap是性能非常好的log套件,避免過度alloc memory及非同步的操作log可以大幅度的避免影響程式效能
b. 使用zap來取代fmt.Print
c. 避免在zap.Debug中使用fmt.Sprintf(fmt.Sprintf仍是消耗較大的API)
DON’t | DO |
fmt.Println("phoneNumber %s", phoneNumber)
OR
import "uber-go/zap"
zap.Debug(fmt.Sprintf("Update phone number %d ", phoneNumber))
|
import "uber-go/zap"
zap.Debug("Update phone number", zap.String("phone_number", phoneNumber))
|
2. 使用defer來釋放資源
a. 很大程度的避免漏掉關閉或移除建立的資源
DON’t | DO |
tx := core.DB.Begin()
err = models.ResetPhone(tx, cInfo.UIDStr, "0", false)
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
|
tx := core.DB.Begin()
defer func (){
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
err = models.ResetPhone(tx, cInfo.UIDStr, "0", false)
|
3. 處理Type轉換錯誤
a. 如果不處理錯誤,當型別錯誤時將產生panic
DON’t | DO |
|
t, ok := i.(string)
if !ok {
// 處理錯誤
}
|
4. 優先使用strconv避免使用fmt
a. strconv效能是fmt的一倍以上
DON’t | DO |
for i := 0; i < b.N; i++ {
s := fmt.Sprint(rand.Int())
}
|
for i := 0; i < b.N; i++ {
s := strconv.Itoa(rand.Int())
}
|
5. 不要使用Panic
a. 每個錯誤應該有對應的處理方式而非使用panic
DON’t | DO |
func foo(bar string) {
if len(bar) == 0 {
panic("bar must not be empty")
}
// ...
}
|
func foo(bar string) error {
if len(bar) == 0 {
return errors.New("bar must not be empty")
}
// ...
return nil
}
|
使用Wechat(微信))掃描QR Code贊助我吧!
comments powered by