如何在未知类型的地图上编写函数?

jcq*_*a88 -2 types go

我感兴趣地阅读了一个关于如何在 Go 中创建映射键切片(使用范围循环)的问题,但是如何编写一个函数来为任何类型的映射执行此操作?映射值类型是一个特别麻烦的问题,因为它甚至不会影响结果切片的类型。

\n

例如,我可以编写一个函数,将 map[int]T (其中 T 是任何类型)作为参数并返回 map\xe2\x80\x99s 键的 []int (整数切片)吗?如果\xe2\x80\x99s可能的话,是否可以使函数在map[T1]T2(其中T1和T2是任何类型)上运行并返回[]T1切片?也就是说,我该如何替换下面代码中的问号?我\xe2\x80\x99m猜测我需要一个接口,但我\xe2\x80\x99m对这些接口有点初学者。

\n
    func keys(m map[?]?) []? {\n       var s []?\n       k := range m {\n          s = append(s, k)\n       }\n       return s\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

Eli*_*sky 5

可以对像这样的类型这样做map[int]interface{}

func keys(m map[int]interface{}) []int {
   var s []int
   for k := range m {
      s = append(s, k)
   }
   return s
}
Run Code Online (Sandbox Code Playgroud)

要了解接口,请从 Go 之旅开始: https: //tour.golang.org/methods/9


但在 Go 获得泛型之前,这对于具体类型是不可能的。

不过,仿制药正在开发中。一旦他们登陆 Go,你将能够编写:

func keys[T any](m map[int]T) []int {
    var s []int
    for k := range m {
        s = append(s, k)
    }
    return s
}
Run Code Online (Sandbox Code Playgroud)