猿问

如何在 Golang 中返回动态类型结构?

我正在将 Golang Revel 用于一些网络项目,到目前为止我确实喜欢 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


}

如您所见,它们都返回相同类型的数据(结构类型)。我的想法只是像这样传递字符串 var:


func (c Helper) ReturnModels(modelName string) []*interface{} {


    //do rethinkdb select with modelName and return []*interface{} for modelName

}

像这样,我可以只有一个助手来返回数据类型,而不是为不同的模型但相同的数据类型一遍又一遍地做同样的事情。


我的问题是:

  1. 这可能吗

  2. 如果是,你能指出我正确的文档吗

  3. 如果没有,我会更乐意回复您的回答:)


慕慕森
浏览 293回答 1
1回答

紫衣仙女

是的,这是可能的,但是您的函数应该返回interface{}而不是[]*interface。func (c Helper) ReturnModels(modelName string) interface{} {}在这种情况下,您可以使用类型开关和/或类型断言将返回值转换为其原始类型。例子注意:我从未使用过 Revel,但以下代码片段应该可以让您大致了解:package mainimport "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]}
随时随地看视频慕课网APP

相关分类

Python
我要回答