我想创建一个切片图,将值附加到相应切片上。但是,当尝试直接附加到通过访问它返回的切片时(请参见下面的注释),它不会被存储,因此我不得不使用长格式访问(注释下方的行)。
为什么会这样呢?我希望访问地图可以返回某种指针,所以在我看来mappedAminoAcid == aminoAcidsToCodons[aminoAcid];显然,我错了。
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} } }
如果基础数组必须增长以适应新元素,则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是添加的完美的第一个参数,所以您可以将代码简化为
nil
aminoAcidsToCodons := map[rune][]string{} for codon, aminoAcid := range utils.CodonsToAminoAcid { aminoAcidsToCodons[aminoAcid] = append(aminoAcidsToCodons[aminoAcid], codon) }