首頁 >後端開發 >Golang >如何限制特定類型的介面{}

如何限制特定類型的介面{}

WBOY
WBOY轉載
2024-02-05 22:57:04604瀏覽

如何限制特定類型的介面{}

問題內容

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

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除