gpt4 book ai didi

go - 在函数中传递接口(interface) slice 并解码到它的项目中

转载 作者:数据小太阳 更新时间:2023-10-29 03:25:31 25 4
gpt4 key购买 nike

我可以将一片结构传递给函数,转换为 []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 &
}

https://play.golang.org/p/GEbIq9febY

关于go - 在函数中传递接口(interface) slice 并解码到它的项目中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43034937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com