我可以通過某種反射擺脫開關嗎?brand將始終匹配結構名稱package mainimport "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()}
1 回答

慕村225694
TA貢獻1880條經驗 獲得超4個贊
您不能使用reflect僅從其名稱的字符串生成類型,因此可能需要類型工廠的映射,但是根據您所說的需要,您可能希望以編程方式生成它go generate。它基本上會像這樣工作:
var constructors = map[string]func() Car{
"Ford": func() Car{
return &Ford{}
},
"Volkswagen": func() Car{
return &Volkswagen{}
},
}
// ...
car := constructors[brand]()
- 1 回答
- 0 關注
- 140 瀏覽
添加回答
舉報
0/150
提交
取消