我正在使用 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中文网其他相关文章!