Go 地图中的分配顺序
考虑以下 Go 代码:
package main import "fmt" type Vertex struct { Lat, Long float64 } var m map[string]Vertex func main() { m = make(map[string]Vertex) m["Bell Labs"] = Vertex{ 40.68433, 74.39967, } m["test"] = Vertex{ 12.0, 100, } fmt.Println(m["Bell Labs"]) fmt.Println(m) }
输出为:
{40.68433 74.39967} map[Bell Labs:{40.68433 74.39967} test:{12 100}]
但是,如果对声明进行微小更改测试顶点,通过将右大括号向右移动四个空格:
m["test"] = Vertex{ 12.0, 100, }
输出更改为:
{40.68433 74.39967} map[test:{12 100} Bell Labs:{40.68433 74.39967}]
问题出现了:为什么这个轻微的修改会影响地图的顺序?
答案:
顺序Go 中的映射取决于所使用的底层哈希函数。该哈希函数是随机的,以减轻利用哈希冲突的拒绝服务攻击。请参阅以下问题跟踪器了解更多信息:
http://code.google.com/p/go/issues/detail?id=2630
请务必注意地图顺序语言规范不保证。虽然当前的 Go 实现保持稳定的顺序,但未来的修订可能会在垃圾收集或其他操作期间压缩映射,从而可能在不通过代码显式修改映射的情况下改变顺序。因此,依赖于映射的特定顺序是不明智的。
正如 Go 规范中所述:
映射是无序一种类型的元素组,称为元素类型,由另一种类型(称为键类型)的一组唯一键索引。
以上是为什么更改 Go Map 分配中的缩进会影响输出顺序?的详细内容。更多信息请关注PHP中文网其他相关文章!