1. 程式人生 > 實用技巧 >使用指標解決golang 零值序列化問題

使用指標解決golang 零值序列化問題

很多時候我們基於golang編寫資料庫操作的時候需要進行零值的處理,一般我們的資料操作都是基於orm 以及tag處理的
所以零值就是一個比較費事的事情了,如果業務對於零值有關聯操作那麼我們就需要處理,如果不關聯就不處理。
如果瞭解aws golang 的sdk 的化,處理的就比較好,全部通過指標操作,同時也包裝了一個通用包,以下是一個簡單的
demo說明

參考程式碼

  • main.go
package main
import (
  "encoding/json"
  "log"
)
type user struct {
  Name string `json:"name"`
  Age int  `json:"age,omitempty"`
}
type user2 struct {
  Name string `json:"name"`
  Age *int  `json:"age,omitempty"`
}
// Int int point helper
func Int(value int) *int {
  return &value
}
func main() {
  user0 := user{
    Name: "dalong",
    Age: 0,
   }
  user1 := user{
    Name: "dalong",
    Age: 0,
   }
  user2 := user2{
    Age: Int(0),
   }
  info, err := json.Marshal(user0)
  info1, err := json.Marshal(user1)
  info2, err := json.Marshal(user2)
  if err != nil {
    log.Println(err)
   } else {
    log.Println(string(info), string(info1), string(info2))
   }
}
  • 程式碼說明
    user struct 使用了值傳遞,而且age 為int 為空忽略,所以零值也就有問題了,user2 通過指標處理,所以沒問題
    同時為了方便處理指標包裝了一個Int 函式,可以返回指標資料
  • 執行效果
2020/07/26 10:32:43 {"name":"dalong"} {"name":"dalong"} {"name":"","age":0}

說明

當然如果關注過sql 資料包裝的化,為發現sql 也提供了類似的資料包裝,實際上就是不同模型的適配處理,同時基於新的資料型別
做了包裝

參考資料

https://github.com/aws/aws-sdk-go/blob/master/aws/convert_types.go