Maison > développement back-end > Golang > 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 ?

王林
Libérer: 2024-02-09 12:10:18
avant
388 Les gens l'ont consulté

如何从 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
}
Copier après la connexion

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

}
Copier après la connexion

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
}
Copier après la connexion

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

i write it if you need it
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal