亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang:將鍵從地圖附加到切片切片

Golang:將鍵從地圖附加到切片切片

Go
慕婉清6462132 2022-09-12 20:25:46
我遇到了這個簡單的Golang代碼,并對Go在這里的行為感到驚訝。有人可以解釋這里發生了什么,以及如何正確編寫以下代碼嗎?如您所見,我有一個 ,其中鍵是 的 。我添加幾個值,然后循環訪問 ,將每個鍵轉換為 a 并將每個鍵附加到類型的對象。maparrayintmapslice[][]intfunc test() {    myMap := make(map[[3]int]bool)    myMap[[3]int{1, 2, 3}] = true    myMap[[3]int{0, 5, 4}] = true    myMap[[3]int{9, 7, 1}] = true    myMap[[3]int{0, 2, 8}] = true    array := [][]int{}    for val := range myMap {        array = append(array, val[:])    }    fmt.Println(array)}我本來以為最后一行會打印出來,但是,令我驚訝的是,它打印了,或者,或者其他一些只包含其中一個鍵的變體多次。[[1,2,3], [0,5,4], [9,7,1], [0,2,8]][[0 2 8] [0 2 8] [0 2 8] [0 2 8]][[9 7 1] [9 7 1] [9 7 1] [9 7 1]]我的go版本是1.16.5
查看完整描述

3 回答

?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

在 for 循環中,循環變量在每次迭代時都會被覆蓋。也就是說,是一個數組,對于每次迭代,都會用映射中的下一項覆蓋 的內容。由于您添加了切片(只是數組上的視圖),因此所有切片都作為后備數組,并且它們都具有相同的內容,即無論最后迭代的元素是什么。valvalval


要修復,請復制陣列:


    for val := range myMap {

        val:=val

        array = append(array, val[:])

    }


查看完整回答
反對 回復 2022-09-12
?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

您每次都會追加循環迭代器變量,該變量在每次迭代時都會更新。您需要改為追加本地范圍的副本:


for val := range myMap {

    v := val

    array = append(array, v[:])

}


查看完整回答
反對 回復 2022-09-12
?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

根據 Adrian 的建議,使用簡單的程序重新創建代碼,如下所示:


package main


import (

    "fmt"

)


func main() {

    test()

}

func test() {

    myMap := make(map[[3]int]bool)

    myMap[[3]int{1, 2, 3}] = true

    myMap[[3]int{0, 5, 4}] = true

    myMap[[3]int{9, 7, 1}] = true

    myMap[[3]int{0, 2, 8}] = true

    array := [][]int{}


    for val := range myMap {

        key := val

        array = append(array, key[:])


    }


    fmt.Println(array)

}

輸出:


[[1 2 3] [0 5 4] [9 7 1] [0 2 8]]


查看完整回答
反對 回復 2022-09-12
  • 3 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號