首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取map的关键字

如何获取map的关键字
EN

Stack Overflow用户
提问于 2016-08-22 11:57:12
回答 2查看 10.2K关注 0票数 6

我有一个名为Keys()的函数来获取映射的所有键,代码如下:

代码语言:javascript
复制
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
}

但我有

代码语言:javascript
复制
cannot use m2 (type map[int]interface {}) as type map[interface {}]interface {} in argument to Keys

Go支持泛型吗?我应该如何修复我的代码?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-22 12:40:01

1- map[interface{}]interface{}是强类型语言,因此map[int]interface{}与Golang不兼容。

intinterface{}的类型不同,请参阅:Go: What's the meaning of interface{}?

2-不,Golang不支持泛型,这是非常好的,因为它使语言简单而快速。

您有一些选项:

如果您不想更改所使用的贴图类型:

1-您可以将函数编辑为:func Keys(m map[int]interface{}) []int,如下面的工作示例代码所示:

代码语言:javascript
复制
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
}

输出(可能没有按顺序):

代码语言:javascript
复制
[2 3]

2-或者您可以将该函数编辑为:func Keys(m map[int]interface{}) []interface{},如下面的工作示例代码:

代码语言:javascript
复制
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
}

输出(可能没有按顺序):

代码语言:javascript
复制
[2 3]

如果您不想更改所使用的Keys函数:

3-您可以将地图编辑为:map[interface{}]interface{},如下面的工作示例代码所示:

代码语言:javascript
复制
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包,但会有性能(速度)的损失。

请参阅:The Laws of Reflection

票数 7
EN

Stack Overflow用户

发布于 2016-08-22 13:57:59

除了Amd的解决方案之外,如果您不想更改所使用的贴图类型,还可以使用反射库。

代码语言:javascript
复制
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返回的键将包含包装在接口本身中的每个键值。因此,要获得实际值,您可能需要执行类型断言:

代码语言:javascript
复制
k := Keys(m2)
k1 := k[0].(int) // k[0] is an interface value, k1 is an int

Working Code

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39071202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档