登录
首页 >  Golang >  Go问答

利用golang的反射初始化符合接口的结构

来源:stackoverflow

时间:2024-02-26 10:18:13 131浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《利用golang的反射初始化符合接口的结构》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新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()
}

解决方案


您不能使用 reflect 仅从其名称的字符串生成类型,因此可能需要类型工厂的映射,但对于您所说的需要的情况,您可能希望使用 go 以编程方式生成它生成。它基本上像这样工作:

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

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

好了,本文到此结束,带大家了解了《利用golang的反射初始化符合接口的结构》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>