
我正在使用 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号