Go语言如何通过Postman传递time.Weekday参数并存储至数据库
解决Go中自定义Weekday类型的表单参数绑定问题
这个错误的核心原因很明确:HTTP表单传递的参数都是字符串类型,而你的Weekday是自定义的整数枚举类型,直接赋值肯定会出现类型不匹配。下面给你两种实用的解决方案,同时告诉你Postman的具体传参方式:
方案1:直接传递数字值(最简单高效)
因为你的Weekday是基于iota定义的,对应关系是:
Sunday = 0Monday = 1Tuesday = 2- ...
Saturday = 6
Postman传参步骤:
- 选择POST请求,URL填
/schedule - 切换到
Body标签,选择form-data格式 - 添加一个参数:
- Key:
day - Value: 填对应星期的数字(比如
1代表周一)
- Key:
代码处理逻辑:
把表单获取到的字符串转成整数,再强转为你的Weekday类型,同时做合法性校验:
import "strconv" func SaveData(c *gin.Context) { var schedule Schedule dayStr := c.PostForm("day") dayInt, err := strconv.Atoi(dayStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "day必须是有效的数字"}) return } // 校验数字范围是否在0-6之间 if dayInt < 0 || dayInt > 6 { c.JSON(http.StatusBadRequest, gin.H{"error": "day的取值范围是0-6"}) return } // 赋值给自定义Weekday类型 schedule.Day = Weekday(dayInt) // 后续的数据库存储逻辑... }
方案2:传递星期字符串(更直观友好)
如果不想让调用者记数字,可以传递"Monday"、"Tuesday"这类字符串,通过映射表转换为对应的枚举值。
Postman传参步骤:
和方案1一样用form-data,只是day的Value填星期的英文名称(比如"Monday",大小写可以兼容):
- Key:
day - Value:
Monday(或monday、MONDAY)
代码处理逻辑:
先定义字符串到Weekday的映射表,再做转换:
import "strings" // 定义字符串到自定义Weekday的映射 var weekdayMap = map[string]Weekday{ "Sunday": Sunday, "Monday": Monday, "Tuesday": Tuesday, "Wednesday": Wednesday, "Thursday": Thursday, "Friday": Friday, "Saturday": Saturday, } func SaveData(c *gin.Context) { var schedule Schedule dayStr := strings.TrimSpace(c.PostForm("day")) // 统一转成首字母大写,兼容各种大小写输入 normalizedDay := strings.Title(dayStr) weekday, ok := weekdayMap[normalizedDay] if !ok { c.JSON(http.StatusBadRequest, gin.H{"error": "day必须是以下值之一:Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday"}) return } schedule.Day = weekday // 后续的数据库存储逻辑... }
额外注意事项
确保你的Schedule结构体中Day字段的类型是你自定义的Weekday,而不是time.Weekday:
type Schedule struct { Id int `json:"_id" bson:"_id"` Day Weekday `form:"day" json:"day" bson:"day"` // 这里是自定义的Weekday StartDate int64 `form:"start_date" json:"start_date" bson:"start_date"` // 其他字段保持不变... }
内容的提问来源于stack exchange,提问作者user9684058
相关产品推荐
相关产品推荐

