我正在使用 go,并且有一个工厂函数,它根据请求的标识符返回不同类型的对象:
func newobject(id string) interface{} { switch id { case "truck": return truck{} case "car": return car{} .... } }
以下是各自的结构类型:
type Truck struct { Foo string } type Car struct { Bar string }
如您所见,卡车和汽车没有任何共同点。问题的产生是因为我现在在调用 newobject(..) 时必须处理过于宽泛的类型 interface{} 。我知道有泛型,但这需要在类型约束中保留所有受支持类型的列表,这会使我的代码库中的事情变得复杂。
基本上我正在寻找一种如何在这里使用继承的方法,go 当然不支持。另一种选择是什么?
newobject(..)函数可以在泛型的支持下实现。您不需要在类型约束中保留所有支持类型的列表。
func NewObject[T any](id string) T { var vehicle any switch id { case "truck": vehicle = Truck{ Foo: "foo", } case "car": vehicle = Car{ Bar: "bar", } } if val, ok := vehicle.(T); ok { return val } var otherVehicle T fmt.Printf("Not implemented. Returning with default values for \"%v\"\n", id) return otherVehicle }
您可以在此处查看完整示例。
以上就是如何限制特定类型的接口{}的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号