我有一个名为Keys()的函数来获取映射的所有键,代码如下:
func main() {
m2 := map[int]interface{}{
2:"string",
3:"int",
}
fmt.Println(Keys(m2))
}
func Keys(m map[interface{}]interface{}) (keys []interface{}) {
for k := range m {
keys = append(keys, k)
}
return keys
}但我有
cannot use m2 (type map[int]interface {}) as type map[interface {}]interface {} in argument to KeysGo支持泛型吗?我应该如何修复我的代码?
发布于 2016-08-22 12:40:01
1- map[interface{}]interface{}是强类型语言,因此map[int]interface{}与Golang不兼容。
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包,但会有性能(速度)的损失。
发布于 2016-08-22 13:57:59
除了Amd的解决方案之外,如果您不想更改所使用的贴图类型,还可以使用反射库。
func main() {
m2 := map[int]interface{}{
2: "string",
3: "int",
}
k := Keys(m2)
fmt.Printf("Keys: %v\n", k)
}
func Keys(m interface{}) (keys []interface{}) {
v := reflect.ValueOf(m)
if v.Kind() != reflect.Map {
fmt.Errorf("input type not a map: %v", v)
}
for _, k := range v.MapKeys() {
keys = append(keys, k.Interface())
}
return keys
}请注意,如果您使用此解决方案,则从Keys返回的键将包含包装在接口本身中的每个键值。因此,要获得实际值,您可能需要执行类型断言:
k := Keys(m2)
k1 := k[0].(int) // k[0] is an interface value, k1 is an inthttps://stackoverflow.com/questions/39071202
复制相似问题