Golang 中的動態結構類型回傳
在Revel 專案中,不同模型之間的回傳類型通常會存在顯出的冗餘餘。
考慮這兩個函數:
func (c Helper) Brands() []*models.Brand { // Select from rethinkdb and populate models.Brand var brands []*models.Brand rows.All(&brands) return brands } func (c Helper) BlogPosts() []*models.Post { // Select from rethinkdb and populate models.Post var posts []*models.Post rows.All(&posts) return posts }
兩個函數都傳回相同類型的資料(指向結構切片的指標)。為了減少冗餘,一個想法是創建一個通用返回函數,並返回一個能夠表示不同類型的介面{}。
func (c Helper) ReturnModels(modelName string) interface{} { // Select from rethinkdb based on modelName and return interface{} }
透過這種方法,將只有一個返回函數,從而簡化了程式碼並減少了冗餘。
但是,需要注意的是,返回介面{}附帶注意事項:
以下程式碼範例示範了此方法:
package main import "fmt" type Post struct { Author string Content string } type Brand struct { Name string } var database map[string]interface{} func init() { database = make(map[string]interface{}) brands := []Brand{ {Name: "Gucci"}, {Name: "LV"}, } database["brands"] = brands posts := []Post{ {Author: "J.K.R", Content: "Whatever"}, } database["posts"] = posts } func main() { fmt.Println("List of Brands:") if brands, ok := ReturnModels("brands").([]Brand); ok { fmt.Printf("%v", brands) } fmt.Println("\nList of Posts:") if posts, ok := ReturnModels("posts").([]Post); ok { fmt.Printf("%v", posts) } } func ReturnModels(modelName string) interface{} { return database[modelName] }
以上是Golang 的動態結構類型傳回如何在管理類型安全風險的同時提高程式碼效率?的詳細內容。更多資訊請關注PHP中文網其他相關文章!