使用指標解決golang 零值序列化問題
阿新 • • 發佈:2020-07-26
很多時候我們基於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