首页 > 解决方案 > 检索任意映射变量的键

问题描述

我想获取任意映射变量的键。我发现了这个函数,它复制了 PHParray_keys行为:https ://www.php2golang.com/method/function.array-keys.html 。但是下面的代码:

items := map[string]int{
    "one":   1,
    "two":   2,
    "three": 3,
}
keys := ArrayKeys(items)

引发下一个“编译时”异常:

不能在 ArrayKeys 的参数中使用项目(类型 map[string]int)作为类型 map[interface {}]interface {}

我究竟做错了什么?

这是一个例子: https: //play.golang.org/p/0ImqjPJFFiE

标签: gocasting

解决方案


您应该更改函数以使用您的类型:

func ArrayKeys(elements map[string]int) []string  {
    i, keys := 0, make([]string, len(elements))
    for key, _ := range elements {
        keys[i] = key
        i++
    }
    return keys
}

https://play.golang.org/p/n5kZego0ePY

但是为什么要更改签名呢?

如果 Go 中的函数采用空接口,则所有包含变量都不再具有类型。但是 Go 是强类型的,所以处理没有类型的变量是很困难的。如果您提供像您这样的功能,则代码应该真正处理任何类型。为此,您需要使用反射包。如果你有一个错误,你错过了一些东西,你的程序会在错误发生时恐慌。当您编写服务器时,它可以运行数月然后停止运行。

如果您ArrayKey为每种类型编写一个函数,那么事情就会有所不同。编译器确保您的代码是健壮的,并且在那时永远不会恐慌。如果您想尝试将该函数与另一种类型的映射一起使用,则代码将无法编译。这就是 Go 的工作方式。


推荐阅读