2016-06-10 9 views
1

Ich habe den folgenden Code:Golang Schnittstellen & Casting

func returnTheMap() map[string][]string{ 
     myThing := getSomeValue() 
    } 

getSomeValue() kehrt etwas vom Typ map[string]interface{}

aber es ist immer intern ein map[string][]string.

Was ist der beste Weg myThing gleichzusetzen mit getSomeValue(), aber vom Typ map[string][]string?

Ich kann ein neues Objekt wie so machen:

newMap := make(map[string][]string) 

// cardTypeList is of type map[string]interface {}, must convert to map[string][]string 
for k, v := range myThing { 
    newMap[k] = v.([]string) 
} 

aber ist es eine Möglichkeit, diese an Ort und Stelle zu tun, oder ist es eine bevorzugte Art und Weise, dies zu tun?

Antwort

6

Gemäß Go FAQ können Sie den Slice-Typ nicht direkt ändern.

So scheint es, dass Ihre Lösung der bevorzugte Weg ist.

+0

Das ist richtig. Das Ändern des Slice-Typs ist eine O (n) -Operation, und die Golang-Entwickler wollten nicht, dass eine O (n) -Typkonvertierung wie andere Typumwandlungen aussieht (welche O (1) sind). Um sie zu erzwingen, müssen Sie den Inhalt explizit durchlaufen und einzeln type-assert, um im Code zu verdeutlichen, dass die Operation keine konstante Zeit ist. – Kaedys

0

Ist getSomeValue() Ihre Funktion? Wenn ja, würde ich den Rückgabetyp auf map[string][]string statt map[string][]interface ändern.

Wenn das nicht der Fall ist, würde ich einige Helfer erstellen, die durchgehen und überprüfen, ob die Typen Ihren Bedürfnissen entsprechen. Ich habe ein Beispiel auf dem Spielplatz

https://play.golang.org/p/9OPgXGXADY