如何读取存储结构体指针的interface{}类型值的字段
解决Go中interface{}类型读取结构体字段的问题
你的问题在于res.Data的静态类型是interface{},Go作为静态类型语言,编译时无法识别其底层实际类型为*UserData,因此直接访问字段会报错。需要通过类型断言将interface{}转换为具体类型后,才能读取字段。以下是几种可行的解决方式:
方法一:安全类型断言(推荐)
使用带ok参数的类型断言,避免类型不匹配时触发panic:
userData, ok := res.Data.(*UserData) if ok { fmt.Println(userData.UserName) // 输出:abc } else { fmt.Println("Data字段类型不是*UserData") }
方法二:直接类型断言(确定类型时使用)
如果你能100%确定res.Data的实际类型是*UserData,可以直接断言访问字段,但类型不匹配时会触发panic:
fmt.Println(res.Data.(*UserData).UserName) // 输出:abc
方法三:优化结构体定义(更简洁)
如果Result的Data字段只会存储UserData类型,建议直接指定Data的类型为*UserData,省去类型断言步骤:
type Result struct { Status string `json:"status"` Data *UserData `json:"data"` } // 解析后直接访问字段 var res Result json.Unmarshal([]byte(`{"status": "success", "data": {"user_id":15,"user_name":"abc"}}`), &res) fmt.Println(res.Data.UserName) // 输出:abc
补充说明
你代码中res.Data = &UserData这行其实可以省略:当Data是interface{}类型时,json.Unmarshal会自动根据传入的指针类型将JSON数据解析到对应的结构体中;如果省略这行,res.Data初始为nil,Unmarshal会自动创建UserData实例并赋值给res.Data,此时res.Data的实际类型仍是*UserData,仍需类型断言才能访问字段。
内容的提问来源于stack exchange,提问作者Sharad Kale
相关产品推荐
相关产品推荐

