使用指針解決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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM