1 回答

TA貢獻1831條經驗 獲得超4個贊
無法使用反射 API 來辨別一個類型是從另一個類型創建的。
規范說:
類型定義創建一個新的、不同的類型,其基礎類型和操作與給定類型相同,并將標識符綁定到該類型。
和
新類型稱為已定義類型。它不同于任何其他類型,包括創建它的類型。
該規范未定義已定義類型與創建該類型時所基于的類型之間的任何其他關系。沒有“創建自”關系供反射 API 公開。
在示例中
type A B
反射 API 無法告訴您類型 A 是從類型 B 創建的,因為除了共享的基礎類型之外,類型 A 和類型 B 之間沒有關系。
允許從 A 到 B 和 B 到 A 的類型轉換,因為 A 和 B 具有相同的基礎類型。
您可以使用反射 API 來確定兩個類型是否具有相同的基礎類型,但這對解決問題沒有幫助??赡苁茿是從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 關注
- 94 瀏覽
添加回答
舉報