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
的源代码,并且如果indirectvalue
和maxKeySize
是maxValueSize
和type 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也需要做更多的工作。
那么性能是支持此功能的唯一原因吗?
还是其他考虑因素?
我认为,支持这样的语法很有价值。
答案 0 :(得分:1)
据我所知
这是因为a[0]
可以替换为数组的地址。
类似地,a[1]
可以替换为a[0]+(keySize*1)
。
但是,如果map不能那样做,则哈希算法会根据您的键,值对和它们的数量不时更改。
它们也会不时地重新排列。
需要特定的计算才能获得值的地址。
数组或切片很容易寻址,但是在映射的情况下,就像是多个函数调用或结构查找...
如果人们正在考虑将其替换为需要的任何计算,那么二进制大小将以数量级增加,并且更多的散列算法可以不时变化。