Golang Development Guideline

Posted by Joe's Notes on Tuesday, December 31, 2019

TOC

1. 使用uber-go/zap 來印出Log

a. zap是性能非常好的log套件,避免過度alloc memory及非同步的操作log可以大幅度的避免影響程式效能 b. 使用zap來取代fmt.Print c. 避免在zap.Debug中使用fmt.Sprintf(fmt.Sprintf仍是消耗較大的API)

DON’tDO

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’tDO

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’tDO

t := i.(string)

t, ok := i.(string)
if !ok {
  // 處理錯誤
}

4. 優先使用strconv避免使用fmt

a. strconv效能是fmt的一倍以上

DON’tDO

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’tDO

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
}

「您的支持是創作的原動力」

Joe's Notes

您的支持是創作的原動力

使用Wechat(微信))掃描QR Code贊助我吧!


comments powered by Disqus