Heim >Backend-Entwicklung >Golang >Wie kann ich eine Liste von Schnittstellen aus einer for-Schleife in Go zurückgeben?

Wie kann ich eine Liste von Schnittstellen aus einer for-Schleife in Go zurückgeben?

王林
王林nach vorne
2024-02-09 12:10:18373Durchsuche

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

In der Go-Sprache können wir Datenstrukturen wie Arrays, Slices und Maps durch for-Schleifen durchlaufen. Manchmal müssen wir jedoch eine Liste von Schnittstellen in einer Schleife zurückgeben. Dies ist eine häufige Anforderung, da eine Schnittstelle ein abstrakter Typ ist, der mehrere konkrete Typen darstellen kann. In diesem Artikel wird erläutert, wie Sie eine for-Schleife in Go verwenden, um eine Liste von Schnittstellen zurückzugeben. Zunächst müssen wir die Konzepte von Schnittstellentypen und Typzusicherungen in Go verstehen.

Frageninhalt

Wie gebe ich eine Liste von Schnittstellen aus einer for-Schleife in go zurück? Angenommen, ich habe die folgenden Daten:

id Name Projekttyp
1 Projektname 1
2 Projektname 1
3 Projektname 1
4 Projektname 2
5 Projektname 2
6 Projektname 3
7 Projektname 3
8 Projektname 3
9 Projektname 4
10 Projektname 4

Ich kann den folgenden Go-Code verwenden, um zwei Listen mit project_type=1 und project_type=2 zu erhalten,

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
}

Aber jetzt sind die Daten von 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 ist größer als 2, ich muss eine Liste von interface{} abrufen, ich versuche den folgenden Code neu zu schreiben, weiß aber nicht, was ich als nächstes schreiben soll und wie ich das zurückgeben soll Schnittstellenliste aus der for-Schleife in go? Danke für deinen Vorschlag.

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

}

Workaround

Wenn Sie 10 Ergebnisse pro Projekttyp wünschen (alle 10*n Ergebnisse):

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
}

Wenn es insgesamt 10 Ergebnisse über alle Arten gibt:

i write it if you need it

Das obige ist der detaillierte Inhalt vonWie kann ich eine Liste von Schnittstellen aus einer for-Schleife in Go zurückgeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen