我可以通过某种反射摆脱开关吗?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] 删除。
我来说两句