在Go语言中,我们可以通过for循环来遍历数组、切片、映射等数据结构。但是,有时候我们需要在循环中返回一个接口列表。这是一个常见的需求,因为接口是一种抽象类型,可以代表多种具体类型。本文将介绍如何在Go中使用for循环返回接口列表。首先,我们需要理解Go中的接口类型和类型断言的概念。
问题内容
如何从 go 中的 for 循环返回接口列表? 假设我有如下数据:
id | name | project_type |
---|---|---|
1 | project_name | 1 |
2 | project_name | 1 |
3 | project_name | 1 |
4 | project_name | 2 |
5 | project_name | 2 |
6 | project_name | 3 |
7 | project_name | 3 |
8 | project_name | 3 |
9 | project_name | 4 |
10 | project_name | 4 |
我可以使用下面的go代码来获取project_type=1和project_type=2的两个列表,
func (d *db) projectlist(type, uid string, size uint64) (interface{}, interface{}, error) {
type resp struct {
name string `json:"name"`
id string `json:"id"`
projecttype string `json:"project_type"`
}
var project_type_1 []*resp
var project_type_2 []*resp
sql = fmt.sprintf(sql, where.string())
_, err := d.ctx.db().selectbysql("select * from project where project_type=1 order by rand() limit 10").load(&project_type_1)
_, err = d.ctx.db().selectbysql("select * from project where project_type=2 order by rand() limit 10").load(&project_type_2)
return project_type_1, project_type_2, err
}
但是现在project_type的数据是的json[{"project_type":1,"name":"something else"},{"project_type":2,"name":"something else"},{ "project_type":3,"name":"something else"},{"project_type":4,"name":"something else"}]
,project_type大于2,我必须获取一个interface{}列表,我尝试重写如下代码,但我不知道下一步该怎么写,如何从go中的for循环返回接口列表?非常感谢您的建议。
func newprojectlist(d *db) ([]interface{}, error) {
var s = make([]projecttype, 0)
data, err := d.querystring("project_type")
if err != nil {
return nil, err
}
err = json.unmarshal([]byte(data), &s)
if err != nil {
return nil, err
}
for _, shorttype := range s {
fmt.println("this is shorttype", shorttype)
}
return nil, err
}
解决方法
如果您希望每个project_type有10个结果(全部10*n个结果):
func (d *db) projectlist(type, uid string, size uint64) ([]interface{}, error) {
type resp struct {
name string `json:"name"`
id string `json:"id"`
projecttype string `json:"project_type"`
}
// get all types, you can get it from db
// example: select distinct projecttype from project
types := []string{"1", "2", "3", "4"}
ans := []interface{}{}
for _, stype := range types {
var project_type []*resp
sql = fmt.sprintf(sql, where.string())
_, err := d.ctx.db().selectbysql("select * from project where project_type=" + stype + " order by rand() limit 10").load(&project_type)
ans = append(ans, project_type)
}
return ans, nil
}
如果所有类型总共有 10 个结果:
i write it if you need it
以上就是如何从 Go 中的 for 循环返回接口列表?的详细内容,更多请关注编程网其它相关文章!