在 Go 中,映射是将键映射到特定值的通用数据结构。然而,可能会出现我们希望利用多个映射的键的情况,即使它们的值类型不同。考虑以下代码片段:
func main() { mapOne := map[string]int mapTwo := map[string]double mapThree := map[string]SomeStruct useKeys(mapOne) } func useKeys(m map[string]interface{}) { // something with keys here }
在此示例中,我们有三个映射:mapOne 保存整数,mapTwo 存储双精度值,mapThree 包含 SomeStruct 的实例。我们的目标是创建一个 useKeys 函数,它接受带有字符串键的映射和由 interface{} 表示的任意值类型。然而,这种设计并没有达到预期的效果。
在 Go 中,map 和 slice 是通用结构,但它们缺乏协方差。这意味着虽然您可以将map[string]int分配给map[string]interface{}类型的变量,但您无法安全地修改分配的map的值而不导致错误。
如果我们只需要获取映射的键而不考虑其值类型,我们可以诉诸反射:
func useKeys(m interface{}) { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { fmt.Println("not a map!") return } keys := v.MapKeys() fmt.Println(keys) }
这个解决方案并不像我们想要的那么优雅,但它可以有效地检索并打印传递给它的任何映射的键,而不管包含的值类型如何。
以上是无论值类型如何,如何访问 Go 中的映射键?的详细内容。更多信息请关注PHP中文网其他相关文章!