我正在使用帶有 Gin 的 Go 1.17。這是我的結構:
package model
type Movie struct {
ID string `json:"id"`
Year uint16 `json:"year" binding:"required,lt=3000"`
RentNumber uint32 `json:"rent_number" db:"rent_number" binding:"required,lt=4294967290"`
Title string `json:"title" binding:"required,max=255"`
Author string `json:"author" binding:"required,max=80"`
Editor string `json:"editor" binding:"required,max=125"`
Index string `json:"index" binding:"required,max=125"`
Bib string `json:"bib" binding:"required,max=20"`
Ref string `json:"ref" binding:"required,max=20"`
Cat1 string `json:"cat_1" db:"cat_1" binding:"required,max=20"`
Cat2 string `json:"cat_2" db:"cat_2" binding:"required,max=10"`
}
我在某個處理程式中使用此結構時遇到問題。在這個處理程式中,我只需要使用我的電影結構中的 2 個屬性(標題和年份)。如果我正在做這樣的事情:
func (h *Handler) myHandler(c *gin.Context) {
var movie model.Movie
if err := c.ShouldBindJSON(&movie); err != nil {
c.Error(err)
c.Abort()
return
}
...
它將無法作業,因為在此 Web 服務上,我將僅發送 2 個屬性,并且將從系結標簽中獲取所需的錯誤:
{
"title": My title",
"year": 2017
}
所以我想知道處理這個問題的“方法”是什么?我可以看到 3 個解決方案。
使用電影結構并忽略除
Titleand之外的所有欄位Year,但我該怎么做?創建一個僅包含所需欄位的特定結構。在這種情況下,我不會將此結構放在模型包中,而是放在我的電影 API 包中
type StructForTheSpecialHandler struct { Year uint16 `json:"year" binding:"required,lt=3000"` Title string `json:"title" binding:"required,max=255"` }直接在我的處理程式中創建結構,如下所示:
func (h *Handler) myHandler(c *gin.Context) { var tmp struct { Year uint16 `json:"year" binding:"required,lt=3000"` Title string `json:"title" binding:"required,max=255"` } if err := c.ShouldBindJSON(&tmp); err != nil { c.Error(err) c.Abort() return } ...
你能告訴我你是否有更好的解決方案,或者告訴我我的 3 個解決方案之間的正確方法是什么?
uj5u.com熱心網友回復:
您可以直接解組它(完全繞過驗證):
err := json.NewDecoder(c.Request.Body).Decode(&movie)
或者您可以嘗試將這些屬性嵌入到結構中:
type EmbeddedMovieFields struct {
Year uint16 `json:"year" binding:"required,lt=3000"`
Title string `json:"title" binding:"required,max=255"`
}
type Movie struct {
EmbeddedMovieFields
ID string `json:"id"`
RentNumber uint32 `json:"rent_number" db:"rent_number" binding:"required,lt=4294967290"`
Author string `json:"author" binding:"required,max=80"`
Editor string `json:"editor" binding:"required,max=125"`
Index string `json:"index" binding:"required,max=125"`
Bib string `json:"bib" binding:"required,max=20"`
Ref string `json:"ref" binding:"required,max=20"`
Cat1 string `json:"cat_1" db:"cat_1" binding:"required,max=20"`
Cat2 string `json:"cat_2" db:"cat_2" binding:"required,max=10"`
}
var movie model.EmbeddedMovieFields
if err := c.ShouldBindJSON(&movie); err != nil {
c.Error(err)
c.Abort()
return
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/365983.html
