interface-Typ {} unterstützt nicht die Indizierung in golang
Ich habe eine solche Karte:
Map := make(map[string]interface{})
Dieser Karte enthalten soll, mapping von string zu array von Objekten. Arrays können von verschiedenen Typen sein, wie []Users
oder []Hosts
. Ich besiedelten dieses array:
TopologyMap["Users"] = Users_Array
TopologyMap["Hosts"] = Hosts_Array
aber wenn ich versuche, zu bekommen, ein Elemente aus:
Map["Users"][0]
gibt es einen Fehler:
(type interface {} does not support indexing)
Wie kann ich es überwinden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie explizit in Ihrem interface {}, um eine Scheibe von dem erwarteten Typ, es zu erreichen. So etwas wie dieses
https://play.golang.org/p/yZmniZwFar
Map
zu vermeiden, zusätzliche Aufgaben wie diesehm := Map["hosts"].([]Host)
?Erste, was zu beachten ist die
interface{}
halten können jeden Datentyp einschließlichfunction
undstruct
oder[]struct
. Da der Fehler gibt Sie :Bedeutet es, dass es hält keine
slice
oder keinearray
Werte. Weil Sie direkt dieindex
in diesem Fall ist0
zu eineminterface{}
und Sie davon ausgehen, dass dieMap["Users"]
ist ein array. Ist es aber nicht. Dies ist eine sehr gute Sache zu Gehen, ist es statisch Typ, was bedeutet, alle Daten, die Typ-Prüfung auf Zeit zusammengestellt.wenn Sie wollen, um zu vermeiden den parsing-Fehler wie dieser:
Zu vermeiden, dass Fehler während Ihrer Analyse zu einem anderen Typ, wie
Map["user"].([]User)
nur für den Fall, dass ein anderer Datentyp übergeben, um dieinterface{}
betrachten Sie das code-snippet unten :Oben genannten code ist einfach und Sie können es verwenden, um zu überprüfen, ob die Schnittstelle entspricht dem Typ, den Sie analysieren.
Und wenn Sie möchten, um mehr Allgemeine übergibt den Wert an Ihre
interface{}
zur Laufzeit können Sie überprüfen, zuerst mitreflect.TypeOf()
bitte betrachten Sie diesen code :nachdem Sie wissen, was der Wert der
interface{}
können Sie getrost analysiert werden, die Ihre spezifischen Daten geben in diesem Fall slice von Benutzer[]User
. Nicht, dass diemain
es ist ein Paket-Namen, die Sie ändern können, es zu verkaufen.