我想创建一个切片贴图,其中值附加到相应切片。但是,当尝试直接附加到通过访问它返回的切片时(请参阅下面的注释),它将不会被存储,因此我必须使用长格式访问(注释下面的行)。
为什么会这样?我希望对地图的访问能够返回某种指针,所以在我看来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}
}
}
答案 0 :(得分:4)
append将返回一个新切片。所以,是的,您必须将新切片放回地图中。这与字符串的工作方式没有什么不同,例如:
var x map[string]string
x["a"] = "foo"
y := x["a"]
y = "bar"
// x["a"] is still "foo"
要获得预期的行为,您必须使用切片指针。
aminoAcidsToCodons := map[rune]*[]string{}
for codon, aminoAcid := range utils.CodonsToAminoAcid {
mappedAminoAcid := aminoAcidsToCodons[aminoAcid]
*mappedAminoAcid = append(*mappedAminoAcid, codon)
}
话虽如此,因为nil
是一个完美的第一个追加参数,你可以简化你的代码
aminoAcidsToCodons := map[rune][]string{}
for codon, aminoAcid := range utils.CodonsToAminoAcid {
aminoAcidsToCodons[aminoAcid] = append(aminoAcidsToCodons[aminoAcid], codon)
}