Golang中range指針數(shù)據(jù)的坑

在Golang中使用for range語句進(jìn)行迭代非常的便捷,但在涉及到指針時(shí)就得小心一點(diǎn)了。

下面的代碼中定義了一個(gè)元素類型為*int的通道ch

package main

import (
    "fmt"
)

func main() {
    ch := make(chan *int, 5)
    
    //sender
    input := []int{1,2,3,4,5}
    
    go func(){
        for _, v := range input {
            ch <- &v
        }
        close(ch)
    }()
    //receiver
    for v := range ch {
        fmt.Println(*v)
    }
}

在上面代碼中,發(fā)送方將input數(shù)組發(fā)送給ch通道,接收方再從ch通道中接收數(shù)據(jù),程序的預(yù)期輸出應(yīng)該是:

1
2
3
4
5

現(xiàn)在運(yùn)行一下程序,得到的輸出如下:

5
5
5
5
5

很明顯,程序并沒有達(dá)到預(yù)期的結(jié)果,那么問題出在哪里呢?我們將代碼稍作修改:

//receiver
    for v := range ch {
        fmt.Println(v)
    }

得到如下輸出:

0x416020
0x416020
0x416020
0x416020
0x416020

可以看到,5次輸出變量v*int)都指向了同一個(gè)地址,返回去檢查一下發(fā)送部分代碼:

for _, v := range input {
    ch <- &v
}

問題正是出在這里,在for range語句中,v變量用于保存迭代input數(shù)組所得的值,但是v只被聲明了一次,此后都是將迭代input出的值賦值給v,v變量的內(nèi)存地址始終未變,這樣再將v的地址發(fā)送給ch通道,發(fā)送的都是同一個(gè)地址,當(dāng)然無法達(dá)到預(yù)期效果。

解決方案是,引入一個(gè)中間變量,每次迭代都重新聲明一個(gè)變量temp,賦值后再將其地址發(fā)送給ch

for _, v := range input {
    temp := v
    ch <- &temp
}

抑或直接引用數(shù)據(jù)的內(nèi)存(推薦,無需開辟新的內(nèi)存空間):

for k, _ := range input {
    c <- &input[k]
}

再次運(yùn)行,就可看到預(yù)期的效果。以上方案是用于討論range語句帶來的問題,當(dāng)然,平時(shí)還是盡量避免使用指針類型的通道。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,346評(píng)論 6 13
  • 一、基礎(chǔ)知識(shí):1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,559評(píng)論 0 4
  • 文/一墨 開始的時(shí)候信心滿滿,走著走著就掉隊(duì)了。一墨讀書會(huì)有一部分孩子也是這樣。 又要開始帶著孩子們開始第16期共...
    河北一墨閱讀 531評(píng)論 0 2
  • 今天閱讀了《巨人的隕落》第一部,怎么說呢?我從最初的對(duì)于本書歷史的不了解到現(xiàn)在有了一個(gè)概念。到現(xiàn)在我看的地方一共發(fā)...
    心情在變化閱讀 425評(píng)論 0 0
  • 懇談?wù)撸何业钠拮觼G下一對(duì)女兒給我,獨(dú)自走了,我看到我兩女兒沒有媽媽就感覺好可憐然后就把所有的錯(cuò)壓在自己身上,簡(jiǎn)直痛...
    夢(mèng)回駝鈴閱讀 545評(píng)論 0 0

友情鏈接更多精彩內(nèi)容