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

标签 go parameters interface slice unmarshalling

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

相关文章:

java - 使用接口(interface) [Java] 中未定义的方法

c++ - 如何从 C++ 项目静态链接 golang 的 .a 库?

php - mysqli_prepare 查询返回 false

html - XMLHttpRequest 无法加载 http ://localhost:9090/receive. 请求的资源上不存在 'Access-Control-Allow-Origin' header

java - 将哈希表作为参数传递给方法会抛出空指针异常

sql - .NET/SQL 中的参数化表名?

Java:扩展类的 if-else 实例

java - "public static final"对于 Java 接口(interface)中的常量是否是多余的?

go - 将变量传递给结构函数

go - govmomi缺少群集名称ClusterComputeResource?