Maison  >  Article  >  développement back-end  >  Comment renvoyer une liste d’interfaces à partir d’une boucle for dans Go ?

Comment renvoyer une liste d’interfaces à partir d’une boucle for dans Go ?

王林
王林avant
2024-02-09 12:10:18335parcourir

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

En langage Go, nous pouvons parcourir des structures de données telles que des tableaux, des tranches et des cartes à travers des boucles for. Cependant, nous devons parfois renvoyer une liste d’interfaces dans une boucle. Il s'agit d'une exigence courante car une interface est un type abstrait qui peut représenter plusieurs types concrets. Cet article explique comment utiliser une boucle for dans Go pour renvoyer une liste d'interfaces. Tout d’abord, nous devons comprendre les concepts de types d’interface et d’assertions de type dans Go.

Contenu de la question

Comment renvoyer une liste d'interfaces à partir d'une boucle for en go ? Supposons que j'ai les données suivantes :

id nom project_type
1 nom_projet 1
2 nom_projet 1
3 nom_projet 1
4 nom_projet 2
5 nom_projet 2
6 nom_projet 3
7 nom_projet 3
8 nom_projet 3
9 nom_projet 4
10 nom_projet 4

Je peux utiliser le code go suivant pour obtenir deux listes de project_type=1 et 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
}

Mais maintenant les données de project_type sont 的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 est supérieur à 2, je dois obtenir une liste d'interface{}, j'essaie de réécrire le code suivant, mais je ne sais pas quoi écrire ensuite, comment renvoyer le liste d'interfaces de la boucle for en go ? Merci pour votre 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 de contournement

Si vous souhaitez 10 résultats par type de projet (tous les 10*n résultats) :

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
}

S'il y a 10 résultats au total tous types confondus :

i write it if you need it

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer