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