1- Golang - это строго типизированный язык, поэтому map[int]interface{}
не совместим с map[interface{}]interface{}
.
int
отличается тип, чем interface{}
, и посмотреть: Go: What's the meaning of interface{}?
2- Нет, Golang не поддерживает генерики, и это очень хорошо, потому что это делает язык простым и быстрым.
У вас есть несколько вариантов:
Если вы не хотите, чтобы изменить тип карты, используемый:
1- Вы можете редактировать функцию: func Keys(m map[int]interface{}) []int
, как этот рабочий код образца:
package main
import "fmt"
func main() {
m2 := map[int]interface{}{
2: "string",
3: "int",
}
fmt.Println(Keys(m2))
}
func Keys(m map[int]interface{}) []int {
keys := make([]int, len(m))
i := 0
for k := range m {
keys[i] = k
i++
}
return keys
}
выход (может быть не в порядке):
[2 3]
2- Или вы можете изменить функцию: func Keys(m map[int]interface{}) []interface{}
, как этот рабочий пример кода:
package main
import "fmt"
func main() {
m2 := map[int]interface{}{
2: "string",
3: "int",
}
fmt.Println(Keys(m2))
}
func Keys(m map[int]interface{}) []interface{} {
keys := make([]interface{}, len(m))
i := 0
for k := range m {
keys[i] = k
i++
}
return keys
}
выход (может быть не в порядке):
[2 3]
Если у вас не хотят изменять используемую функцию Keys
:
3- Вы можете редактировать карту по адресу: map[interface{}]interface{}
, как этот рабочий пример кода:
package main
import "fmt"
func main() {
m2 := map[interface{}]interface{}{
2: "string",
3: "int",
}
fmt.Println(Keys(m2))
}
func Keys(m map[interface{}]interface{}) []interface{} {
keys := make([]interface{}, len(m))
i := 0
for k := range m {
keys[i] = k
i++
}
return keys
}
4- Кроме того, вы можете использовать reflect
пакет для некоторых случаев использования, но с производительностью (скорость) штрафа.
And See: The Laws of Reflection
map [interface {}] interface {} и map [int] interface {} - это другой тип, поэтому вы получаете ошибку. возможно, вы можете изменить m2, чтобы набрать карту интерфейса [interface {}] {} – zzn