golang反射初始化满足接口的结构

我可以通过某种反射摆脱开关吗?brand将始终匹配结构名称


package main


import "fmt"


type Car interface {

    Move()

    SetModel()

}


type Ford struct {

    Model string

}


type Volkswagen struct {

    Model string

}


func (car *Ford) Move() {

    fmt.Println(car.Model + " is moving!")

}


func (car *Ford) SetModel() {

    car.Model = "Focus"

}


func (car *Volkswagen) Move() {

    fmt.Println(car.Model + " is moving!")

}


func (car *Volkswagen) SetModel() {

    car.Model = "Jetta"

}


func main() {

    var car Car


    brand := "Ford"


    switch brand {

    case "Ford":

        car = &Ford{}

    case "Volkswagen":

        car = &Volkswagen{}

    }

    car.SetModel()

    car.Move()

}


智慧大石
浏览 123回答 1
1回答

慕村225694

您不能使用reflect仅从其名称的字符串生成类型,因此可能需要类型工厂的映射,但是根据您所说的需要,您可能希望以编程方式生成它go generate。它基本上会像这样工作:var constructors = map[string]func() Car{    "Ford": func() Car{        return &Ford{}    },    "Volkswagen": func() Car{        return &Volkswagen{}    },}// ...car := constructors[brand]()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go