go - 检索任意映射变量的键
问题描述
我想获取任意映射变量的键。我发现了这个函数,它复制了 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
解决方案
您应该更改函数以使用您的类型:
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 的工作方式。
推荐阅读
- python - 我在使用 MRJob 组合 MapReduce 问题时遇到问题
- python - 意外 Anaconda 卸载中断
- c++ - 我如何处理这段代码的进位和溢出?
- javascript - 更改对象的所有属性
- java - Gson 没有正确序列化 LocalDate
- javascript - 如何使用 React 将内联脚本添加到 Storybook
- javascript - dropzone.js 中的已删除文件第一次不触发
- javascript - 从 Javascript 访问 iOS 目录
- c++ - strtof() 函数放错小数位
- android - 滚动隐藏时如何隐藏锚定到BottomAppBar的FloatingActionButton