假设我有两个结构:
type Pet {
Name string
}
type PetTwo {
Name string
}
现在假设我将 Pet 转换为接口(interface)。假设用于执行此操作的包不知道 Pet 类型,我如何从界面键入 Assert PetTwo?
var ctx context.Context
pet := Pet{ Name : "Foo" }
ctx = context.WithValue(ctx, "pet", pet)
petTwo := ctx.Value("pet").(PetTwo) // panics
fmt.Println(petTwo.Name) // prints "Foo"
有没有一种方法可以在没有类型断言的情况下访问 pet 的内容?
我已经尝试将结构相互嵌入、类型断言、类型断言到未命名类型等等。
主要目标是能够从不知道 Pet
类型的包中访问 Pet
的内容。
实现目标的丑陋 hack 是从 json 编码和解码:
jsonData, _ := json.Marshal(ctx.Value("pet"))
var petTwo PetTwo
json.Unmarshal(jsonData, &petTwo)
fmt.Println(petTwo.Name) // prints "Foo"
最佳答案
使用 reflect用于访问未知类型的名称字段的包:
ctx := context.WithValue(context.Background(), "pet", Pet{"Fido"})
v := reflect.ValueOf(ctx.Value("pet"))
name := v.FieldByName("Name").String()
fmt.Println(name) // prints Fido
关于go - 将结构接口(interface)转换为相同的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57423674/