1 回答

TA贡献1831条经验 获得超4个赞
无法使用反射 API 来辨别一个类型是从另一个类型创建的。
规范说:
类型定义创建一个新的、不同的类型,其基础类型和操作与给定类型相同,并将标识符绑定到该类型。
和
新类型称为已定义类型。它不同于任何其他类型,包括创建它的类型。
该规范未定义已定义类型与创建该类型时所基于的类型之间的任何其他关系。没有“创建自”关系供反射 API 公开。
在示例中
type A B
反射 API 无法告诉您类型 A 是从类型 B 创建的,因为除了共享的基础类型之外,类型 A 和类型 B 之间没有关系。
允许从 A 到 B 和 B 到 A 的类型转换,因为 A 和 B 具有相同的基础类型。
您可以使用反射 API 来确定两个类型是否具有相同的基础类型,但这对解决问题没有帮助。可能是A是从B创建的,B是从A创建的,或者两者都不是从另一个创建的。在此示例中,类型 A 和 B 具有相同的基础类型:
type A int type B int
问题指出,解析器具有 的内置解码器。目标是将该解析器用于 。以下是解决此问题的一些方法:uuid.UID
type TransactionID uuid.UUID
嵌入将类型声明为 。检查具有单个已知嵌入字段的结构并相应地进行处理。type TransactionID struct { uuid.UID }
注册表添加函数函数以注册可转换类型之间的映射。
var decodeAs = map[reflect.Type]reflect.Type{} func RegisterDecodeAs(target, decode reflect.Type) { if !decode.ConvertibleTo(target) { panic("type must be convertible") } decodeAs[target] = decode }
解码时,请检查 中的解码类型。如果存在,则解码为解码类型,转换为目标类型并分配。decodeAs
在程序启动时调用注册函数:
func init() { RegisterDecodeAs(reflect.TypeOf(TransactionID(nil)), reflect.TypeOf(uuid.UUID(nil)) }
- 1 回答
- 0 关注
- 101 浏览
添加回答
举报