2017-02-23 15 views
6

Mam funkcję:Używanie map [ciąg] int jako parametr typu map [interfejs {}] interfejs {}

func ReturnTuples(map_ map[interface{}]interface{}) [][]interface{} { 

W którym staram się nazwać tak:

m := make(map[string]int) 
m["k1"] = 7 
m["k2"] = 13 
fmt.Println(ReturnTuples(m)) 

Ale jestem coraz

cannot use m (type map[string]int) as type map[interface {}]interface {} in argument to ReturnTuples 

nie powinien on działać od string i int zarówno wdrożenia interface{} ?

Szukałem i najlepsze, co mogłem znaleźć, to Convert map[interface {}]interface {} to map[string]string, ale nie odpowiem, dlaczego nie mogę użyć argumentu w postaci m.

Wierzę również, że jeśli argument funkcji byłby tylko interface{}, to też by działało, ponieważ map[something][something] implementuje interface, prawda? Jaki jest najlepszy sposób, aby to zrobić i dlaczego nie zadziała w moim przypadku?

+2

https://golang.org/doc/faq#covariant_types – Volker

+0

@Volker, ale nie widzę niewłaściwego sposobu metody, nie wymusiłem nawet tego typu metody, ponieważ właśnie drukuję wartość zwracaną przez funkcję. Problem, jak mówi kompilator, dotyczy typu argumentu –

+3

Powodem, dla którego nie można przekazać 'map [string] int' jako że' map [interface {}] interaface {} 'to' string', 'int', i 'interface {}' all ma inną strukturę danych. 'string' to pojedynczy wskaźnik, który może być 64-bitowy,' int' to być może 64-bitowa wartość podpisu, jednak 'interface {}' to struktura dwóch wskaźników o nazwie [emptyInterface] (https://golang.org/src/reflect/value) .go # L174) – ymonad

Odpowiedz

6

Rozwiązaniem problemu, wystarczy zainicjować mapę jako pusty interfejs pustych interfejsów:

m := map[interface{}]interface{}

następnie można przypisać dowolny klawisz lub wpisz wartość, którą chcesz w funkcji 'ReturnTuples.

playground example

UWAGA: należy pamiętać, że jeśli chcesz użyć wartości później jako oryginalnych typów, trzeba będzie użyć typu twierdzenie, ponieważ teraz są typu interface{}

można zrobić coś tak jak to były anything jest jedna wartość map, które można uzyskać za pomocą pętli for:

switch v := anything.(type) { 
     case string: 
      fmt.Println(v) 
     case int32, int64: 
      fmt.Println(v) 
     case string: 
      fmt.Println(v) 
     case SomeCustomType: 
      fmt.Println(v) 
     default: 
      fmt.Println("unknown") 
} 

Jeśli szukasz wyjaśnień na „dlaczego” @ymonad dał pełną odpowiedź, więc nie będę powtórzyć go ponownie.

nadzieję, że to ma sens

PS: nie daj się głosy w dół na pytanie, legit jeden w moich oczach ...

+1

Dziękuję, dokładnie tego potrzebowałem. I tak, mam już dość tych pochlebstw. Wszystko jest teraz przegłosowane ... –

+0

Wygląda na to, że link do placu zabaw nie działa z powodu "Niedostępne z powodów prawnych". –

+0

Stephen L właśnie to sprawdził i zadziałało –

Powiązane problemy