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中文网其他相关文章!