dsbx40787736 2019-08-09 04:55
浏览 56
已采纳

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

Let's say I have two structs:

type Pet {
  Name string
}

type PetTwo {
  Name string
}

Now let's say that I convert Pet to an interface. How can I Type Assert PetTwo from the interface assuming that the package with which I am doing this from has no knowledge of the Pet type?

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"

Is there a way I can access the contents of pet without a type assertion?

I've tried to embed the structs in each other, type assertions, type assertions to unnamed types and more.

The main goal is to be able to access the contents of Pet from a package with no knowledge of the Pet type.

An ugly hack that achieves the goal is to marshal and unmarshal from json:

    jsonData, _ := json.Marshal(ctx.Value("pet"))
    var petTwo PetTwo
    json.Unmarshal(jsonData, &petTwo)
    fmt.Println(petTwo.Name) // prints "Foo"
  • 写回答

1条回答 默认 最新

  • dpqg86714 2019-08-09 05:18
    关注

    Use the reflect package to access the Name field of an unknown type:

    ctx := context.WithValue(context.Background(), "pet", Pet{"Fido"})
    v := reflect.ValueOf(ctx.Value("pet"))
    name := v.FieldByName("Name").String()
    fmt.Println(name) // prints Fido
    

    Run it on the playground.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器