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

go (reflect): 如何实例化一个任意类型并设置一个已知的嵌入字段

go (reflect): 如何实例化一个任意类型并设置一个已知的嵌入字段

Go
繁花不似锦 2021-11-01 16:19:53
考虑以下类型声明:type (    Embedded struct{}    Actual1 struct{ *Embedded }    Actual2 struct{ *Embedded }    Actual3 struct{ *Embedded })现在考虑下面的函数,其中i可以是类型的Actual1,Actual2或者Actual3(或任何其它类型的嵌入Embedded以类似的方式)。我不能做类型断言或类型切换,因为我不知道有多少类型包含Embedded,我所知道的i是它确实嵌入了Embedded类型。此函数将实例化一个i与embed新实例化的副本实例具有相同类型并在其上设置的新实例。func New(i interface{}, field *Embedded) interface{} {    // Step 1. instantiate new instance of `i`, of same underlying type as `i`    // Step 2. set `i.Embedded` to `field`    // Step 3. return the new instance.}以下是用法:func main() {    actual := &Actual1{}    embed := &Embedded{}    copied := New(actual, embed)    if copied.(Actual1).Embedded != embed {        log.Fatal("It didn't work!")    }}New(...)函数的正确实现不能使用类型断言或类型切换,也不会导致调用log.Fatal上面显示的。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

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