джин, как проверить, был ли парамс отправлен или нет

# #go #go-gin

Вопрос:

 type listParams struct {
    Status int `form:"status"`
    Keyword string `form:"keyword"`
    ShowType int `form:"show_type"`
}

func List(c *gin.Context) {
    var ReqData listParams
    _ = c.ShouldBind(amp;ReqData)
     
    // I fetch this by PostForm() to check it empy if it equal to empty string
    if stat := c.PostForm("status"); stat == "" {
        ReqData.Status = -99
    }

    // .......
}
 

В этом коде, как я могу узнать, было ли это сообщение переднего status плана или нет?

Из-за значения по умолчанию go, если я проверю reqData.Status == 0 , оно всегда будет возвращать значение true, если интерфейс не опубликовал его, но в моем случае 0 это значимое значение, поэтому я не могу проверить его равным 0 .

Так есть ли у меня другой способ проверить это?

PS: Я попробовал и обнаружил, что gorm поле в структуре не будет обновляться, если я не назначу:

 var d amp;User{} // User is a definition of user table
d.ID = 1
d.Name = "Joy"
// d.Status = 1 // It has this field, but I dont assign it
db.Model(amp;User{}).updates(amp;d)
 

Наконец, status не будет обновляться до 0 (в моем понимании, d.Status должно быть 0 )

Ответ №1:

Используйте тип указателя, чтобы обойти значение по умолчанию 0:

 type listParams struct {
    Status amp;int `form:"status"`
    Keyword string `form:"keyword"`
    ShowType int `form:"show_type"`
}
 

Проверьте, если d.Status nil да , в противном случае получите соответствующее значение

Ответ №2:

Я думаю, что это ограничение вызывает необходимость в единственном общедоступном способе создания пользователя.

 type user struct { Status int Keyword string ShowTypeint}
func NewUser() (*user) { return amp;user{Status: -1} }
 

Таким образом, вы гарантируете, что структура пользователя создается только с помощью нового пользователя, у которого статус по умолчанию всегда равен -1.