首页 > 后端开发 > Golang > 正文

如何在 Go 1.18 中安全地使用泛型类型解组 JSON?

Patricia Arquette
发布: 2024-11-01 12:35:02
原创
772 人浏览过

How Can I Safely Unmarshal JSON with Generic Types in Go 1.18?

Unmarshal 中的泛型使用(Go 1.18)

在 Go 1.18 中使用泛型时,例如创建一个容器来保存各种报告类型,可能会出现类型限制。考虑以下设置:

  • 由结构表示的多种报告类型
  • 带有泛型类型参数Reportable的ReportContainer包装器,约束为实现Reportable接口
  • 鉴别器ReportType 用于确定解组期间的具体报告类型

您可以遇到返回类型类型约束的挑战,导致 GetBody() 函数中使用“自由文本语义”来适应类型断言。

挑战和解决方案

问题源于Go 不支持结构的类型断言,并且不允许指向泛型类型的指针。为了解决这个问题,您可以创建一个接口来实现 LocationID、Provider、ReportType 和 Body 的 Getters。然而,这种解决方案需要牺牲类型安全性。

更安全的方法是放弃参数多态性,并在 JSON 解组期间使用基于鉴别器值的具体 switch 语句。这可确保每种报告类型使用正确的具体类型。

替代方法

对于动态 JSON 解析,您可以使用通用的解组函数:

<code class="go">func unmarshalAny[T any](bytes []byte) (*T, error) {
    out := new(T)
    if err := json.Unmarshal(bytes, out); err != nil {
        return nil, err
    }
    return out, nil
}</code>
登录后复制

虽然此函数提供了灵活性,但必须注意,如果它的实现很少,它仅执行与直接内联解组逻辑。因此,只有在引入额外逻辑时,使用此函数才是合理的。

总之,在处理具体类型和 JSON 解组时,请仔细考虑泛型的必要性。必要时选择基于开关的解决方案,而不影响类型安全,并在使用不必要重复功能的泛型函数时务必小心。

以上是如何在 Go 1.18 中安全地使用泛型类型解组 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!