让我们看下面的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}]
但是,如果我更改测试顶点声明的 一 小部分,请向右移动“ }” 4个空格,如下所示:
}
m["test"] = Vertex{ 12.0, 100, }
..然后输出更改为:
{40.68433 74.39967} map[test:{12 100} Bell Labs:{40.68433 74.39967}]
为什么修改很少会影响我的地图顺序?
映射的“顺序”取决于所使用的哈希函数。哈希函数被随机化,以防止使用哈希冲突的拒绝服务攻击。有关详细信息,请参见问题跟踪器:
http://code.google.com/p/go/issues/detail?id=2630
根据规范不能保证地图顺序。尽管在当前的go实现中尚未完成,但将来的实现可以在GC或其他操作期间进行某些压缩,这些操作会更改映射的顺序,而无需通过代码修改映射。假定规范中未定义属性是不明智的。
映射是一种类型的 无序 元素组,称为元素类型,由一组另一种类型的唯一键(称为键类型)索引。