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

我正在将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

}

像这样,我只能使用一个助手来返回数据类型,而不是一遍又一遍地对不同的模型但相同的数据类型执行同一操作。

我的问题是:

  1. 这有可能吗
  2. 如果是,您能指出我正确的文档吗?
  3. 如果没有,我会很乐意返回您的答案:)

回答:

是的,但是您的函数应该返回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]

}

以上是 如何在Golang中返回动态类型struct? 的全部内容, 来源链接: utcz.com/qa/409927.html

回到顶部