我可以将一片结构传递给函数,转换为 []interface{}
,填充它并在函数结束后使用吗?
这是问题的完整示例 https://play.golang.org/p/iPijsawEEg
简短描述:
type DBResponse struct {
Rows int `json:"rows"`
Error string `json:"error"`
Value json.RawMessage `json:"value"`
}
type User struct {
Id int `json:"id"`
Name string `json:"name"`
}
func loadDBRows(p []interface{}) {
var response DBResponse
someDataFromDB := []byte("{\"rows\":1, \"error\": \"\", \"value\": {\"name\":\"John\", \"id\":2}}")
json.Unmarshal(someDataFromDB, &response)
json.Unmarshal(response.Value, &p[0])
fmt.Println(p)//p[0] filled with map, not object
}
func main() {
users := make([]User, 5)
data := make([]interface{}, 5)
for i := range users {
data[i] = users[i]
}
loadDBRows(data)
}
对于单个 interface{}
可以轻松解决此问题,您可以在完整示例中进行测试。为什么我不能用 slice 解决它?
我想不反射(reflection)就去做!有没有什么“真正的方法”可以将通用 json 解析器写入选定的数据结构而无需反射和映射[string]接口(interface){}?不想要复杂的代码和额外的操作
谢谢你的帮助!
最佳答案
由于 p
是接口(interface)的一部分,在这一行 json.Unmarshal(response.Value, &p[0])
中,您将传递一个指向 interface{}
不是 User
,因为 json.Unmarshal
允许将接口(interface)作为解码数据的目的地,它不会在下面查找另一种类型的 interface{}
并将 json
解码为 map
。
您可以做的是让 interface{}
已经是指向具体类型的指针,例如data[i] = &users[i]
然后您只需将不带 &
的接口(interface){}
传递给 json.Unmarshal
.
func loadDBRows(p []interface{}) {
var response DBResponse
someDataFromDB := []byte("{\"rows\":1, \"error\": \"\", \"value\": {\"name\":\"John\", \"id\":2}}")
json.Unmarshal(someDataFromDB, &response)
json.Unmarshal(response.Value, p[0]) // notice the missing &
fmt.Println(p)
}
users := make([]User, 5)
data := make([]interface{}, 5)
for i := range users {
data[i] = &users[i] // notice the added &
}
关于go - 在函数中传递接口(interface) slice 并解码到它的项目中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43034937/