我正在将Golang Revel用于某些Web项目,到目前为止,我确实喜欢12个项目。由于返回类型,在所有这些代码中我都有很多代码冗余。看一下这两个功能:
func (c Helper) Brands() []*models.Brand{ //do some select on rethinkdb and populate correct model var brands []*models.Brand rows.All(&brands) return brands } func (c Helper) BlogPosts() []*models.Post{ //do some select on rethinkdb and populate correct model var posts []*models.Post rows.All(&posts) return posts }
如您所见,它们都返回相同类型的数据(类型struct)。我的想法只是像这样传递字符串var:
func (c Helper) ReturnModels(modelName string) []*interface{} { //do rethinkdb select with modelName and return []*interface{} for modelName }
像这样,我只能使用一个助手来返回数据类型,而不是一遍又一遍地对不同的模型但相同的数据类型执行同一操作。
我的问题是:
是的,但是您的函数应该返回interface{}而不是应该返回[]*interface。
interface{}
[]*interface
func (c Helper) ReturnModels(modelName string) interface{} {}
在这种情况下,您可以使用类型开关和/或类型断言将返回值转换为原始类型。
例
注意:我从未使用过Revel,但是以下代码片段应该为您提供一个总体思路:
操场
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 := make([]Brand, 2) brands[0] = Brand{Name: "Gucci"} brands[1] = Brand{Name: "LV"} database["brands"] = brands posts := make([]Post, 1) posts[0] = 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] }