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)
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:
Définissez votre type results
Type au niveau supérieur, plutôt que dans le corps de la méthode.
Faire SearchItemsByUser
renvoie directement une valeur du type results
au lieu de interface{}
.