Unmarshal 中的泛型使用 (Go 1.18)
在 Go 1.18 中使用泛型时,例如创建一个容器来保存各种报告类型,可能会出现类型限制。考虑以下设置:
您可能会遇到返回类型类型约束的挑战,导致 GetBody() 函数中使用“自由文本语义”来适应类型断言。
挑战和解决方案
问题源于 Go 不支持结构的类型断言,并且不允许指向泛型类型的指针。为了解决这个问题,您可以创建一个接口来实现 LocationID、Provider、ReportType 和 Body 的 Getters。然而,此解决方案需要牺牲类型安全性。
更安全的方法包括放弃参数多态性并在 JSON 解组期间使用基于鉴别器值的具体 switch 语句。这可确保每种报告类型使用正确的具体类型。
替代方法
对于动态 JSON 解析,您可以使用通用的解组函数:
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
}
虽然此函数提供了灵活性,但必须注意,如果其实现很少,则它仅执行与直接内联解组逻辑相同的操作。因此,只有在引入额外的逻辑时,使用此函数才是合理的。
总之,在处理具体类型和 JSON 解组时,请仔细考虑泛型的必要性。必要时选择基于开关的解决方案,而不影响类型安全,并在使用不必要的重复功能的泛型函数时要小心。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3