Heim  >  Artikel  >  Backend-Entwicklung  >  Durchlaufen Sie die Karte von „interface{}“ und rufen Sie für jedes Element in Golang dieselbe Methode auf

Durchlaufen Sie die Karte von „interface{}“ und rufen Sie für jedes Element in Golang dieselbe Methode auf

王林
王林nach vorne
2024-02-05 11:57:54553Durchsuche

迭代“interface{}”的映射并在 Golang 中的每个项目上调用相同的方法

Frageninhalt

Ich entwickle ein einfaches Konsolenspiel zum Erlernen von Go und bin bei einem scheinbar einfachen Problem hängen geblieben, das in anderen Sprachen kein Problem darstellt, in Go jedoch fast unmöglich erscheint.

Ich habe eine Schnittstelle als Feld in einer Struktur wie dieser zugeordnet:

type room struct {
    // ...
    components map[string]interface{}
    // ...
}

Ich muss die Karte durchlaufen und die render() 方法(假设它们都实现 render()-Methode für jedes in der Karte gespeicherte Element aufrufen. Zum Beispiel wäre das in js oder php kein Problem, aber in go stoße ich den ganzen Tag mit dem Kopf gegen die Wand.

Ich brauche so etwas:

for _, v := range currentroom.components {
    v.render()
}

Das hat nicht funktioniert, aber als ich den Typ angegeben und jedes Element manuell einzeln aufgerufen habe, hat es funktioniert:

currentRoom.Components["menu"].(*List.List).Render()
currentRoom.Components["header"].(*Header.Header).Render()

Wie rufe ich die render()-Methode für jedes Element in der Karte auf? Oder wenn es einen besseren/anderen Weg gibt, dieses Problem zu lösen, klären Sie mich bitte auf, da ich hier mit meiner Weisheit am Ende bin.


Richtige Antwort


Schnittstelle definieren:

type renderable interface {
   render()
}

Sie können dann Assert Map Elements eingeben und Render aufrufen, sofern diese Methode implementiert ist:

currentroot.components["menu"].(renderable).render()

Um zu testen, ob etwas darstellbar ist, verwenden Sie:

renderable, ok:=currentRoot.Components["menu"].(Renderable)
if ok {
   renderable.Render()
}

Das obige ist der detaillierte Inhalt vonDurchlaufen Sie die Karte von „interface{}“ und rufen Sie für jedes Element in Golang dieselbe Methode auf. 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