为了账号安全,请及时绑定邮箱和手机立即绑定

将结构体接口转换为相同的结构体

将结构体接口转换为相同的结构体

Go
慕村9548890 2023-07-10 16:38:11
假设我有两个结构:type Pet {  Name string}type PetTwo {  Name string}现在假设我将 Pet 转换为接口。假设我用来执行此操作的包不了解 Pet 类型,如何从界面中键入 Assert PetTwo?var ctx context.Contextpet := Pet{ Name : "Foo" }ctx = context.WithValue(ctx, "pet", pet)petTwo := ctx.Value("pet").(PetTwo) // panicsfmt.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"
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

使用reflect包访问未知类型的Name字段:

ctx := context.WithValue(context.Background(), "pet", Pet{"Fido"})

v := reflect.ValueOf(ctx.Value("pet"))

name := v.FieldByName("Name").String()

fmt.Println(name) // prints Fido

在操场上运行它



查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信