Home  >  Article  >  Backend Development  >  How to return a list of interfaces from a for loop in Go?

How to return a list of interfaces from a for loop in Go?

王林
王林forward
2024-02-09 12:10:18332browse

如何从 Go 中的 for 循环返回接口列表?

In Go language, we can traverse data structures such as arrays, slices, and maps through for loops. However, sometimes we need to return a list of interfaces in a loop. This is a common requirement because an interface is an abstract type that can represent multiple concrete types. This article will introduce how to use a for loop in Go to return a list of interfaces. First, we need to understand the concepts of interface types and type assertions in Go.

Question content

How to return the interface list from a for loop in go? Suppose I have the following data:

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

I can use the following go code to get two lists of project_type=1 and 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
}

But now the data of project_type is 's 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 is greater than 2, I must get an interface{} list, I tried to rewrite the code as below, but I don't know what to write next, how to return the interface list from a for loop in go? Thank you for your suggestion.

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

}

Solution

If you want 10 results per project_type (all 10*n results):

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
}

If there are a total of 10 results for all types:

i write it if you need it

The above is the detailed content of How to return a list of interfaces from a for loop in Go?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete