gpt4 book ai didi

reflection - 去(反射): How to Instantiate an arbitrary type and set a known embedded field

转载 作者:IT王子 更新时间:2023-10-29 01:10:38 25 4
gpt4 key购买 nike

考虑以下类型声明:

type (
Embedded struct{}
Actual1 struct{ *Embedded }
Actual2 struct{ *Embedded }
Actual3 struct{ *Embedded }
)

现在考虑以下函数,其中 i 可能是 Actual1Actual2Actual3 类型(或以类似方式嵌入 Embedded 的任何其他类型)。我无法进行类型断言或类型切换,因为我不知道有多少类型包含 Embedded,关于 i 我所知道的就是它确实嵌入了嵌入式 类型。此函数将实例化一个与 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如上所示。

我想我要问的是这两个问题的组合:

最佳答案

使用反射,你可以这样做:

  • 根据指向它的指针的类型获取结构的类型
  • 实例化并取消引用
  • 使用指针的值设置字段的值(按名称查找)

代码:

v := reflect.New(reflect.TypeOf(i).Elem()).Elem()
f := reflect.ValueOf(field)
v.FieldByName("Embedded").Set(f)
return v.Interface()

Playground :http://play.golang.org/p/fX413svXDv

关于reflection - 去(反射): How to Instantiate an arbitrary type and set a known embedded field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32144977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com