1 回答
TA贡献1809条经验 获得超8个赞
Kubernetes 在运行时处理这个确切的过程。方案结构。我们的想法是,您使用名称或其他标识符注册类型,然后您可以根据标识符随意请求这些类型的新实例。一般来说,此标识符是在序列化过程中派生的,而不是硬编码到源中。
正如您所说,问题在于,您最初需要创建一个新实例。虽然这种模式并不常见,但我在我的职业生涯中遇到过两种情况,这是合乎逻辑的解决方案。以下是K8s为实现这一目标所做的非常精简版本的示例,它可能适用于您尝试做的事情,在这里它正在发挥作用:runtime.Scheme
package main
import (
"fmt"
"reflect"
)
type Scheme struct {
types map[string]reflect.Type
}
func (s *Scheme) RegisterType(name string, t interface{}) {
a := reflect.TypeOf(t)
s.types[name] = a
}
func (s *Scheme) New(name string) (interface{}, error) {
t, ok := s.types[name]
if !ok {
return nil, fmt.Errorf("unrecognized type name: %s", name)
}
return reflect.New(t).Interface(), nil
}
func NewScheme() *Scheme {
return &Scheme{types: map[string]reflect.Type{}}
}
type MyType struct {
Foo string
}
func main() {
scheme := NewScheme()
scheme.RegisterType("my.type", MyType{})
myType, _ := scheme.New("my.type")
myType.(*MyType).Foo = "bar"
fmt.Println("%+v", myType)
}
- 1 回答
- 0 关注
- 103 浏览
添加回答
举报