如何通过名称实例化golang结构并将其用作该类型而不直接引用结构

时间:2017-02-26 20:02:03

标签: go

我看到了一个与此问题非常类似的问题,但它没有解决一个重要问题。你如何通过变量完全做到这一点,而不直接引用结构。

例如,鉴于以下内容,我尝试了一些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 structOperator) 在下面,我收到错误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)
}

提前致谢。

0 个答案:

没有答案