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

用户3781074:

我可以通过某种反射摆脱开关吗?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()
}
阿德里安:

您不能reflect仅使用名称字符串来生成类型,因此可能需要一个类型工厂映射,但是在您需要的情况下,您可能希望使用来以编程方式生成它go generate基本上可以这样工作:

var constructors = map[string]func() Car{
    "Ford": func() Car{
        return &Ford{}
    },
    "Volkswagen": func() Car{
        return &Volkswagen{}
    },
}

// ...
car := constructors[brand]()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章