2016-11-03 2 views
-1

Ich habe die folgende StrukturWie für die Existenz des Schlüssels in einer verschachtelten Struktur

type GiphyJson struct { 
     Type string `json:"type"` 
     Data []struct { 
      Images struct { 
       Fixed_height struct { 
        Url string `json:"url"` 
       } `json:"fixed_height"` 
      } `json:"images"` 
     } `json:"data"` 
    } 

und ich Data[x].Images.Fixed_height.Url zugreifen müssen überprüfen. Idealerweise würde ich gerne vor jedem Zugriff auf Url nach der Existenz der einzelnen Eigenschaften 'Data, Images,, Fixed_height' suchen wollen, um sicherzustellen, dass ich keine Null-Zeiger-Ausnahmen habe. Da ich ziemlich neu in der Sprache bin, war ich neugierig, was der idiomatische Weg wäre, dies zu tun.

Folgendes ist, wie ich die Struktur verwende.

var err error 
var giphyJson GiphyJson 
keyword = url.QueryEscape(keyword) 
resp, err := http.Get("http://api.giphy.com/v1/gifs/search?q=" + keyword + "&api_key=dc6zaTOxFJmzC&limit=100") 
if err != nil { 
    err = errors.New("An error occured trying to contact giphy") 
    return "", err 
} 
defer resp.Body.Close() 
bodyBytes, err := ioutil.ReadAll(resp.Body) 
err = json.Unmarshal(bodyBytes, &giphyJson) 
+0

Die Antwort hängt nur von dem Typ ab, in dem Sie Ihren JSON entpacken. Z.B. Wenn Sie in struct keine Zeiger enthalten, gibt es keine Ausnahme für den nil-Zeiger. Bitte Code anzeigen. – Volker

+0

@Volker ist das nicht die Strukturdefinitionen dort? Es hat keine Zeiger ... zum OP, das einzige, was Sie wirklich überprüfen müssen, ist, dass 'length (Data)> x' – evanmcdonnal

+0

In der obigen Struktur würden Sie überprüfen, dass len (Daten)> 0; Images, Fixed_height und Url haben immer Werte (auch wenn sie nicht in JSON existieren, werden sie auf ihren Nullwert in der Struktur initialisiert). –

Antwort

2

die einzige erforderliche Überprüfung (basierend auf der Definition dieses struct) ist, dass len(Data) > x. Darüber hinaus ist alles ein Werttyp, so dass keine Gefahr besteht, dass eine Null-Referenz-Panik auftritt.

if len(Data) > x { 
    // access 
    fmt.Println(Data[x].Images.Fixed_height.Url) 
} else { 
    // do other stuff you to mitigate unexpected input 
} 
Verwandte Themen