Go中interface{}转map[string]interface{}报错,如何获取其中id值?
问题解决建议
错误原因
报错明确说明传入的data实际类型是LoginResp结构体,而非你断言的map[string]interface{},直接类型转换自然失败。
方案1:直接断言为LoginResp类型
如果LoginResp是你定义的结构体,直接将data断言为该类型,然后访问对应字段(注意结构体字段需首字母大写才能被外部访问):
func Login() func(c *lmhttp.Context, code int, data interface{}) (int, interface{}) { return func(c *lmhttp.Context, code int, data interface{}) (int, interface{}) { loginResp, ok := data.(LoginResp) if !ok { // 处理类型断言失败的情况,比如返回错误码 return http.StatusBadRequest, "invalid data type" } fmt.Print(loginResp, loginResp.ID) // 这里ID要和LoginResp结构体里的字段名一致(首字母大写) // 后续逻辑... return http.StatusOK, nil } }
方案2:将结构体转为map[string]interface{}
如果确实需要将数据转为map格式,可以通过JSON序列化再反序列化的方式实现:
import "encoding/json" func Login() func(c *lmhttp.Context, code int, data interface{}) (int, interface{}) { return func(c *lmhttp.Context, code int, data interface{}) (int, interface{}) { // 序列化结构体为JSON字节 bytes, err := json.Marshal(data) if err != nil { return http.StatusInternalServerError, err.Error() } // 反序列化为map var mapData map[string]interface{} err = json.Unmarshal(bytes, &mapData) if err != nil { return http.StatusInternalServerError, err.Error() } fmt.Print(mapData, mapData["id"]) // 这里的键名要和LoginResp结构体字段的JSON标签一致(如果有设置),否则是大写的字段名比如"ID" // 后续逻辑... return http.StatusOK, nil } }
注意事项
- 结构体字段必须首字母大写,否则无法被外部包访问,也无法被JSON序列化。
- 如果LoginResp结构体字段设置了JSON标签(比如
json:"id"),那么转为map后对应的键名是小写的"id";否则键名是结构体字段的大写名称(比如"ID")。
内容的提问来源于stack exchange,提问作者Elsa
相关产品推荐
相关产品推荐

