我看到了一个与此问题非常类似的问题,但它没有解决一个重要问题。你如何通过变量完全做到这一点,而不直接引用结构。
例如,鉴于以下内容,我尝试了一些main()
方法的变体来测试它:
package main
import (
"reflect"
"fmt"
)
type Operable interface {
compute() string
}
type Operator struct {
Operable
Name string
Type string
}
func (o Operator) compute() string {
return "operating"
}
type Read struct {
Operator
}
func (r Read) compute() string {
return "reading"
}
var Operators = make(map[string]reflect.Type)
func init() {
Operators[reflect.TypeOf(Read{}).Name()] = reflect.TypeOf(Read{})
}
我想从字符串中实例化一个新的Read struct
(Operator
)
在下面,我收到错误theOp.Name undefined (type interface {} is interface with no methods)
。这是预期的。
func main() {
nameOfOp := "Read"
typeOfOp := Operators[nameOfOp]
theOp := reflect.New(typeOfOp).Elem().Interface()
fmt.Println(theOp.Name)
}
如果我执行以下操作,则会收到错误typeOfOp is not a type
。
func main() {
nameOfOp := "Read"
typeOfOp := Operators[nameOfOp]
theOp := reflect.New(typeOfOp).Elem().Interface().(typeOfOp)
fmt.Println(theOp.Name)
}
我发现编译的唯一方法是显式输入结构类型。但我希望这是动态的,任何想法?
func main() {
nameOfOp := "Read"
typeOfOp := Operators[nameOfOp]
theOp := reflect.New(typeOfOp).Elem().Interface().(Read)
fmt.Println(theOp.Name)
}
提前致谢。