首页 > 后端开发 > Golang > 为什么使用接口而不是结构时'json.Unmarshal”会失败?

为什么使用接口而不是结构时'json.Unmarshal”会失败?

Patricia Arquette
发布: 2024-11-26 04:26:12
原创
420 人浏览过

Why Does `json.Unmarshal` Fail When Using Interfaces Instead of Structs?

将 JSON 解组为结构而不是接口

使用 json.Unmarshal 解组 JSON 数据时,为目标变量提供具体类型以避免意外转换非常重要。

在您提供的代码中,您定义了一个函数 getFoo() ,它返回一个包含 Foo 的接口结构。当您将此接口发送到 json.Unmarshal 时,它会将值解释为映射,而不是具体结构。

要解决此问题,您可以在接口中传递指向具体结构的指针,也可以指定直接在 json.Unmarshal.

这里是一个使用具体结构类型的示例指针:

func getFoo() interface{} {
    return &Foo{"bar"}
}

func main() {
    fooInterface := getFoo()

    jsonBytes := []byte(`{"bar":"This is the new value of bar"}`)

    err := json.Unmarshal(jsonBytes, fooInterface)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(fooInterface) // *main.Foo &{Bar:This is the new value of bar}
}
登录后复制

或者,您可以使用类型断言来指定具体类型:

func main() {
    fooInterface := getFoo()

    jsonBytes := []byte(`{"bar":"This is the new value of bar"}`)

    foo := fooInterface.(*Foo)
    err := json.Unmarshal(jsonBytes, foo)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(foo) // &{Bar:This is the new value of bar}
}
登录后复制

通过指针或类型断言提供具体类型,您可以确保json.Unmarshal 直接将数据解组到所需的结构中,保留其类型信息和字段值。

以上是为什么使用接口而不是结构时'json.Unmarshal”会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板