gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:04:14 31 4
gpt4 key购买 nike

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

}

如您所见,它们都返回相同类型的数据(结构类型)。我的想法只是像这样传递字符串 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{} {}

在这种情况下,您可以使用 Type Switches and/or Type Assertions将返回值转换为其原始类型。

示例

注意:我从未使用过 Revel,但以下代码段应该可以让您大致了解一下:

Playground

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]
}

关于go - 如何在 Golang 中返回动态类型结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35657362/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com