为什么golang在slice和map之间的`[]`运算符上实现不同的行为?

时间:2018-11-09 07:03:01

标签: go

type S struct {
    e int
}

func main() {
    a := []S0
    a[0].e = 2

    b := map[int]S{0: {1}}
    b[0].e = 2 // error
}

a [0]是可寻址的,而b [0]不是。

我知道第一个0是一个索引,第二个map是一个密钥。

为什么golang这样实现?还有其他考虑吗?


我已经在github.com/golang/go/src/runtime中阅读了indirectkey的源代码,并且如果indirectvaluemaxKeySizemaxValueSizetype maptype struct { ... keysize uint8 // size of key slot indirectkey bool // store ptr to key instead of key itself valuesize uint8 // size of value slot indirectvalue bool // store ptr to value instead of value itself ... } 已支持地图结构不够。

indirectkey

我认为,如果golang设计师想要这种语法,那么现在就可以轻松实现。

当然,indirectvalue public class StudentEvent { public final String registrationNumber ; public final String name ; public final String course ; public final String branch ; public StudentEvent(String registrationNumber, String name, String course, String branch) { this.registrationNumber = registrationNumber; this.name = name; this.course = course; this.branch = branch; } public String getRegistrationNumber() { return registrationNumber; } public String getName() { return name; } public String getCourse() { return course; } public String getBranch() { return branch; } } 可能会花费更多的资源,GC也需要做更多的工作。

那么性能是支持此功能的唯一原因吗?

还是其他考虑因素?

我认为,支持这样的语法很有价值。

1 个答案:

答案 0 :(得分:1)

据我所知

这是因为a[0]可以替换为数组的地址。

类似地,a[1]可以替换为a[0]+(keySize*1)

但是,如果map不能那样做,则哈希算法会根据您的键,值对和它们的数量不时更改。

它们也会不时地重新排列。

需要特定的计算才能获得值的地址。

数组或切片很容易寻址,但是在映射的情况下,就像是多个函数调用或结构查找...

如果人们正在考虑将其替换为需要的任何计算,那么二进制大小将以数量级增加,并且更多的散列算法可以不时变化。