2 回答
TA贡献1811条经验 获得超4个赞
您将不存在的索引传递给Swap(i, j).
地图类型是复合的。它是根据另外两种类型定义的:键类型和值类型。例子:
map[string]bool
在前面的例子中,string是键类型,bool是值类型。
您可能知道,地图访问返回 1 或 2 个值。在像您这样的 1 返回值上下文中,当给定不存在的索引时,地图访问将返回地图值类型的零值。
这意味着如果您访问m["im_not_defined"]某个mtype 的地图map[string]bool,您将获得一个返回值,该值是bool(地图的值类型)的零值。
您可以通过执行(在 Swap 中)来检查索引是否定义:
if a, k := t[uint32(i)]; k {
t[uint32(j)] = a
} else {
panic("undefined index")
}
类似地对于j.
所以基本上,如果i未定义,则将 的零值GeoNameTally分配给t[j]并导致您的“空”(零)值。
无论如何,如果你想对任何东西进行排序,你就必须使用切片。根据定义,地图是无序的。
TA贡献1802条经验 获得超5个赞
从 Go 1.8 开始,有一种更简单的方法可以对切片进行排序,而无需您定义新类型。您只需创建一个 Less(匿名)lambda。
a := []int{5, 3, 4, 7, 8, 9}
sort.Slice(a, func(i, j int) bool {
return a[i] < a[j]
})
for _, v := range a {
fmt.Println(v)
}
- 2 回答
- 0 关注
- 140 浏览
添加回答
举报