一尘不染

Google Go Lang分配顺序

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}]

但是,如果我更改测试顶点声明的 小部分,请向右移动“ }” 4个空格,如下所示:

m["test"] = Vertex{
    12.0, 100,
}

..然后输出更改为:

{40.68433 74.39967}

map[test:{12 100} Bell Labs:{40.68433 74.39967}]

为什么修改很少会影响我的地图顺序?


阅读 288

收藏
2020-07-02

共1个答案

一尘不染

映射的“顺序”取决于所使用的哈希函数。哈希函数被随机化,以防止使用哈希冲突的拒绝服务攻击。有关详细信息,请参见问题跟踪器:

http://code.google.com/p/go/issues/detail?id=2630

根据规范不能保证地图顺序。尽管在当前的go实现中尚未完成,但将来的实现可以在GC或其他操作期间进行某些压缩,这些操作会更改映射的顺序,而无需通过代码修改映射。假定规范中未定义属性是不明智的。

映射是一种类型的 无序 元素组,称为元素类型,由一组另一种类型的唯一键(称为键类型)索引。

2020-07-02