在這個游樂場鏈接中,我創建了我的代碼的一個人為版本,我在其中創建了一個基于輸入字符串的 X 類型的變量。該變量將是少數類型之一并實現一個接口。該代碼當前編譯并提供了正確的結果,但是它給我留下了相當冗長的印象,我正在嘗試尋找是否有一種速記方法來實現我正在實現的結果。該示例有 3 種實現接口(動物)的類型(狗、貓和鳥),但是我的實際代碼在此 switch 語句中將有多達 40 種類型。我使用這段代碼的原因是當從 DBMS 中檢索結果時,我試圖使用一種通用的加載方法,當與sqlx結合使用時,它會根據輸入字符串將數據庫表加載到正確的結構中。我可以完全控制應用程序,并且可以根據需要將輸入字符串更改為另一種類型。來自游樂場鏈接的代碼:package mainimport ( "fmt")type animal interface { call() string}type dog struct {}func (d *dog) call() string { return "Woof!"}type cat struct {}func (c *cat) call() string { return "Meow!"}type bird struct {}func (c *bird) call() string { return "Chirp!"}func main() { var animal animal animalType := "dog" switch animalType{ case "dog": animal = new(dog) case "cat": animal = new(cat) case "bird": animal = new(bird)
1 回答

米琪卡哇伊
TA貢獻1998條經驗 獲得超6個贊
您可以創建一個從“字符串”到“返回動物的函數”的哈希圖,但設置它會比 switch 語句更冗長。
像這樣的(未測試)
type AnimalCtor func() animal
var animalMap map[string]AnimalCtor
.....
func init() {
animalMap["dog"] = func() animal { return &dog{} }
animalMap["cat"] = func() animal { return &cat{} }
animalMap["bird"] = func() animal { return &bird{} }
.....
}
func createAnimalFromString(input string) animal {
ctor, ok := animalMap[input]
if ok {
return ctor()
} else {
return nil
}
}
但它比 switch 語句冗長得多,并且模糊了原本應該明確和清楚的內容。
- 1 回答
- 0 關注
- 114 瀏覽
添加回答
舉報
0/150
提交
取消