首页 > 后端开发 > Golang > 在Go中将JSON解组到interface{}后如何有效处理类型断言?

在Go中将JSON解组到interface{}后如何有效处理类型断言?

Patricia Arquette
发布: 2024-12-24 15:56:11
原创
603 人浏览过

How Can I Efficiently Handle Type Assertion After Unmarshalling JSON into interface{} in Go?

解组到 Interface{} 以进行 Golang 中的类型断言

在此场景中,JSON 字符串通过 RabbitMQ 传输。这些字符串表示两个不同结构 Somthing1 和 Somthing2 的实例。目标是将 JSON 字符串解组回各自的结构并执行类型断言。

问题

乍一看,似乎是解组为接口{},然后应用类型断言应该足够了。然而,在解组时,输入变量的类型为map[string]interface{}。这与预期不符,尝试打开此类型或将其重新分配给所需的结构会失败。

解决方案

Golang 中的 JSON 库解组为默认类型,例如 bool、float64和映射[字符串]接口{}。要获得所需的结构,您需要直接解组到它们或从map[string]interface{}手动转换。

使用直接解组

首选方法是直接解组到结构体:

func typeAssert(msg string) {
    var job Somthing1
    json.Unmarshal([]byte(msg), &job)

    // ...

    var stats Somthing2
    json.Unmarshal([]byte(msg), &stats)

    // ...
}
登录后复制

使用解包器struct

如果直接解组不可行,您可以使用 Unpacker 结构体来处理解组并提供访问数据的接口:

type Unpacker struct {
    Data       interface{}
}

func (u *Unpacker) UnmarshalJSON(b []byte) error {
    // Attempt to unmarshal into both types
    smth1 := &Something1{}
    err := json.Unmarshal(b, smth1)

    if err == nil && smth1.Thing != "" {
        u.Data = smth1
        return nil
    }

    smth2 := &Something2{}
    err = json.Unmarshal(b, smth2)
    if err != nil {
        return err
    }

    u.Data = smth2
    return nil
}
登录后复制

然后,您可以使用 Unpacker 来访问未编组的数据:

func typeAssert(msg string) {
    unpacker := &Unpacker{}
    json.Unmarshal([]byte(msg), unpacker)

    switch v := unpacker.Data.(type) {
    case Something1:
        // ...

    case Something2:
        // ...

    default:
        // Handle unknown type
    }
}
登录后复制

以上是在Go中将JSON解组到interface{}后如何有效处理类型断言?的详细内容。更多信息请关注PHP中文网其他相关文章!

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