作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
考虑以下类型声明:
type (
Embedded struct{}
Actual1 struct{ *Embedded }
Actual2 struct{ *Embedded }
Actual3 struct{ *Embedded }
)
现在考虑以下函数,其中 i
可能是 Actual1
、Actual2
或 Actual3
类型(或以类似方式嵌入 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/
我是一名优秀的程序员,十分优秀!