php小编草莓为您介绍一款名为“GO 中将 Map 转换为 List 的通用函数”的实用工具。这个函数可以帮助您将键值对映射(Map)的数据结构转换为列表(List)的数据结构。通过这个通用函数,您可以方便地将复杂的数据结构转换为更简洁的形式,提高代码的可读性和可维护性。无论您是在开发中遇到了类似的需求,还是想了解更多关于数据结构转换的技巧,这个通用函数都将给您带来便利和启发。让我们一起来探索这个实用工具吧!
问题内容
如何在 go 中编写一个函数,将任何 map 转换为对象列表(删除键)?
例如:
func maptolist(inputmap map[any]any) any {
var resultlist []any
for _, obj := range inputmap {
resultlist = append(resultlist, obj)
}
return resultlist
}
func main() {
mymap := make(map[string]string)
mymap["a"] = "1"
mymap["b"] = "12"
l := maptolist(mymap).([]string)
fmt.printf("(%v, %t)\n", l, l)
}
将输出:([1 12], []string)
但我总是遇到类型问题并且没有找到解决方法。使用类型断言或转换我遇到了类似的问题。
cannot use myMap (variable of type map[string]string) as map[any]any value in argument to mapToList
我应该如何编写maptolist()函数?
它必须作为输入 inputmap map[any]any
或 inputmap any
因为我想传递任何类型的地图(map[string]customstruct; map[int][]customstruct 等)
更新:我在第一次编写该函数时添加了该函数以及有关输入的更多详细信息
解决方法
请参阅本关于泛型的教程或语言规范
any
不是变量类型,它是一个type约束
,可以使用的类型的描述。您需要使用约束 any
定义类型参数,然后从参数签名中引用泛型类型。
// | from this point on, k and v are
// | now valid types to use in the function
func maptoslice[k comparable, v any](m map[k]v) []v {
s := make([]v, 0, len(m))
for _, v := range m {
s = append(s, v)
}
return s
}
参数m
必须是map[k]v
,其中k
是comparable
类型,v
是any
类型。返回类型 []v
将是与输入映射中的值具有相同类型的切片。
请注意,any
不能用作映射键的约束,因为并非所有类型都可以用作键,只有 可比较的
类型。
然后,要调用该方法,请传入满足约束的类型(例如 map[string][]string
),可以选择显式显示类型参数。
m := map[string][]string{
"a": {"b", "c"},
"d": {"e", "f"},
}
s := maptoslice(m)
// or
t := maptoslice[string, []string](m)
// [[b c] [e f]]
通过明确类型,您可以自行记录代码并捕获任何意外的类型问题。例如,以下代码将返回错误:
v := mapToSlice[string, []int](m)
...
./main.go:14:33: cannot use m (variable of type map[string][]string) as map[string][]int value in argument to mapToSlice[string, []int]
以上就是GO 中将 Map 转换为 List 的通用函数的详细内容,更多请关注编程网其它相关文章!