【发布时间】:2017-09-29 15:34:45
【问题描述】:
我想创建一个切片映射,其中值附加到相应的切片。但是,当尝试直接附加到通过访问它返回的切片时(参见下面的评论),它不会被存储,所以我不得不使用长格式访问(评论下方的行)。
为什么会这样?我希望对地图的访问能够返回某种指针,所以在我看来mappedAminoAcid == aminoAcidsToCodons[aminoAcid];很明显,我错了。
谢谢!
aminoAcidsToCodons := map[rune][]string{}
for codon, aminoAcid := range utils.CodonsToAminoAcid {
mappedAminoAcid, ok := aminoAcidsToCodons[aminoAcid]
if ok {
// NOT WORKING: mappedAminoAcid = append(mappedAminoAcid, codon)
aminoAcidsToCodons[aminoAcid] = append(mappedAminoAcid, codon)
} else {
aminoAcidsToCodons[aminoAcid] = []string{codon}
}
}
【问题讨论】:
-
这就是 Go 的工作原理。您从地图索引操作中取回一个新切片。附加到这个切片确实附加到这个切片,并且不会做任何魔术,比如“我源于地图索引操作,所以让我们修改地图而不是我。”
-
这很有趣,我认为切片基本上是指向数组的指针,所以我认为索引操作会返回指向该数组的指针。谢谢!
-
@jonathanGB:切片确实像指向数组的指针一样工作(切片头包含长度、容量和数组指针),但您希望它像指向数组指针的指针一样工作.
-
切片本身是一个具有复制语义的普通值。它正在查看的支持数组是共享的。它可能在追加或不更新期间更新,具体取决于上限。
-
@jonathanGB:是的,但是数组指针也是该副本的一部分,因此如果需要重新分配数组,那也将有所不同。
标签: go