使用 Go 的强类型系统,采用接口{}类型键的映射的函数无法应用于映射具有 int 类型的键。虽然 Go 目前不支持泛型,但我们可以通过多种方式实现泛型 Keys 函数:
如果我们希望保留 Map 的类型,我们可以修改 Keys 函数以采用 map[int]interface{} 参数并将键显式转换为 interface{}:
func Keys(m map[int]interface{}) []interface{} { keys := make([]interface{}, len(m)) i := 0 for k := range m { keys[i] = k i++ } return keys }
或者,我们可以使用Go的反射包来访问地图的键并将它们转换为interface{}。但是,这种方法可能会对性能产生影响:
func Keys(m interface{}) []interface{} { t := reflect.TypeOf(m) if t.Kind() != reflect.Map { panic("argument must be a map") } keys := make([]interface{}, 0) for _, key := range reflect.ValueOf(m).MapKeys() { keys = append(keys, key.Interface()) } return keys }
为了避免潜在的性能问题,我们可以定义一个通用辅助函数来转换映射[ int]interface{} 到 map[interface{}]interface{}:
func convertMap[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1) map[K2]V2 { ret := make(map[K2]V2, len(m)) for k, v := range m { ret[k.(K2)] = v.(V2) } return ret } // Keys returns the keys of the provided map. func Keys[K comparable, V any](m map[K]V) []K { keys := make([]K, len(m)) i := 0 for k := range m { keys[i] = k i++ } return keys }
通过这些辅助函数,我们可以使用以下代码:
m2 := map[int]interface{}{ 2: "string", 3: "int", } convertedMap := convertMap(m2) result := Keys(convertedMap) fmt.Println(result)
以上是如何在 Go 中高效地从 Map 中检索 Key?的详细内容。更多信息请关注PHP中文网其他相关文章!