# #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.