首頁 > 後端開發 > Golang > 主體

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

WBOY
發布: 2024-02-05 22:57:04
轉載
529 人瀏覽過

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

問題內容

我正在使用 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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!