go語言---for range

來源:互聯網
上載者:User

標籤:https   建立   而不是   html   int   程式   問題   就會   快速   

學習-go語言坑之for rangehttps://www.cnblogs.com/hetonghai/p/6718250.html

go只提供了一種迴圈方式,即for迴圈,在使用時可以像c那樣使用,也可以通過for range方式遍曆容器類型如數組、切片和映射。但是在使用for range時,如果使用不當,就會出現一些問題,導致程式運行行為不如預期。比如,下面的樣本程式將遍曆一個切片,並將切片的值當成映射的鍵和值存入,切片類型是一個int型,映射的類型是鍵為int型,值為*int,即值是一個地址。

package main import "fmt" func main() {    slice := []int{0, 1, 2, 3}    myMap := make(map[int]*int)     for index, value := range slice {        myMap[index] = &value    }    fmt.Println("=====new map=====")    prtMap(myMap)} func prtMap(myMap map[int]*int) {    for key, value := range myMap {        fmt.Printf("map[%v]=%v\n", key, *value)    }}

運行程式輸出如下:

=====new map=====
map[3]=3
map[0]=3
map[1]=3
map[2]=3

由輸出可以知道,不是我們預期的輸出,正確輸出應該如下:

=====new map=====
map[0]=0
map[1]=1
map[2]=2
map[3]=3

但是由輸出可以知道,映射的值都相同且都是3。其實可以猜測映射的值都是同一個地址,遍曆到切片的最後一個元素3時,將3寫入了該地址,所以導致映射所有值都相同。其實真實原因也是如此,因為for range建立了每個元素的副本,而不是直接返回每個元素的引用,如果使用該值變數的地址作為指向每個元素的指標,就會導致錯誤,在迭代時,返回的變數是一個迭代過程中根據切片依次賦值的新變數,所以值的地址總是相同的,導致結果不如預期。
修正後程式如下:

package main import "fmt" func main() {    slice := []int{0, 1, 2, 3}    myMap := make(map[int]*int)     for index, value := range slice {        num := value        myMap[index] = &num    }    fmt.Println("=====new map=====")    prtMap(myMap)} func prtMap(myMap map[int]*int) {    for key, value := range myMap {        fmt.Printf("map[%v]=%v\n", key, *value)    }}

運行程式輸出如下:

=====new map=====
map[2]=2
map[3]=3
map[0]=0
map[1]=1

彩蛋--快速的執行是成功的關鍵!

go語言---for range

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.