web-dev-qa-db-fra.com

Golang Comment accéder aux champs d'interface

J'ai une fonction comme ci-dessous qui décode des données JSON et le renvoie comme une interface

package search

func SearchItemsByUser(r *http.Request) interface{} {

    type results struct {
        Hits             hits
        NbHits           int
        NbPages          int
        HitsPerPage      int
        ProcessingTimeMS int
        Query            string
        Params           string
    }

    var Result results

    er := json.Unmarshal(body, &Result)
    if er != nil {
        fmt.Println("error:", er)
    }
    return Result

}

J'essaie d'accéder aux champs de données (par exemple les paramètres) mais pour certaines raisons, il est indiqué que l'interface n'a pas de tel champ. Une idée pourquoi?

func test(w http.ResponseWriter, r *http.Request) {

    result := search.SearchItemsByUser(r)
        fmt.Fprintf(w, "%s", result.Params)
19
themihai

Une variable d'interface peut être utilisée pour stocker n'importe quelle valeur conforme à l'interface et appelez les méthodes d'art de cette interface. Notez que vous ne pourrez pas accéder à des champs sur la valeur sous-jacente via une variable d'interface.

Dans ce cas, votre méthode SearchItemsByUser renvoie un interface{} valeur (c'est-à-dire l'interface vide), qui peut contenir n'importe quelle valeur mais ne fournit aucun accès direct à cette valeur. Vous pouvez extraire la valeur dynamique détenue par la variable d'interface via une affirmation de type, comme:

dynamic_value := interface_variable.(typename)

Sauf que dans ce cas, le type de valeur dynamique est privé à votre méthode SearchIssByuser. Je suggérerais de faire deux modifications à votre code:

  1. Définissez votre type results Type au niveau supérieur, plutôt que dans le corps de la méthode.

  2. Faire SearchItemsByUser renvoie directement une valeur du type results au lieu de interface{}.

20
James Henstridge