Go must pattern

道地 Go 錯誤處理模式: Must

UUID v7 Must

最近用到 Go 官方 uuid 庫產生 UUID v7 時候留意到一種使用方式是:Must🔗,他的描述也很簡單:

Must returns uuid if err is nil and panics otherwise.
func Must(uuid UUID, err error) UUID {
if err != nil {
panic(err)
}
return uuid
}

用途是「當錯誤不是一個可以恢復的選項時」,使用包裝好的 Must 直接 panic 錯誤。

// Before
id, err := uuid.NewV7()
if err != nil {
log.Fatalf("failed to generate UUID v7: %v", err)
}
// After
mustId := uuid.Must(uuid.NewV7())

總結

Must 是 Go 生態的一種慣例用來操作當場 panic 也合理的數值
var (
validEmail = regexp.MustCompile(`^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$`)
validID = regexp.MustCompile(`^[a-z]+\[[0-9]+\]$`)
)
func init() {
templates = template.Must(template.ParseGlob("templates/*.html"))
}
  • 適合:初始化階段(init()main() 開頭、全域變數初始化),這時 panic 等同於啟動失敗,Fatal 終止整個程式是合理的。
  • 不適合:在 HTTP handler、goroutine 裡或使用者請求的處理路徑中,panic 會導致整個服務崩潰或 recover 邏輯複雜化。

延伸閱讀