關(guān)于Golang中range指針數(shù)據(jù)的坑詳解
前言
在Golang中使用 for range 語(yǔ)句進(jìn)行迭代非常的便捷,但在涉及到指針時(shí)就得小心一點(diǎn)了。
下面的代碼中定義了一個(gè)元素類(lèi)型為 *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 通道,接收方再?gòu)?ch 通道中接收數(shù)據(jù),程序的預(yù)期輸出應(yīng)該是:
現(xiàn)在運(yùn)行一下程序,得到的輸出如下:
很明顯,程序并沒(méi)有達(dá)到預(yù)期的結(jié)果,那么問(wèn)題出在哪里呢?我們將代碼稍作修改:
//receiver for v := range ch { fmt.Println(v) }
得到如下輸出:
0x416020
0x416020
0x416020
0x416020
0x416020
可以看到,5次輸出變量 v ( *int )都指向了同一個(gè)地址,返回去檢查一下發(fā)送部分代碼:
for _, v := range input { ch <- &v }
問(wèn)題正是出在這里,在 for range 語(yǔ)句中, v 變量用于保存迭代 input 數(shù)組所得的值,但是 v 只被聲明了一次,此后都是將迭代 input 出的值賦值給 v , v 變量的內(nèi)存地址始終未變,這樣再將 v 的地址發(fā)送給 ch 通道,發(fā)送的都是同一個(gè)地址,當(dāng)然無(wú)法達(dá)到預(yù)期效果。
解決方案:
引入一個(gè)中間變量,每次迭代都重新聲明一個(gè)變量 temp ,賦值后再將其地址發(fā)送給 ch :
for _, v := range input { temp := v ch <- &temp }
抑或直接引用數(shù)據(jù)的內(nèi)存(推薦,無(wú)需開(kāi)辟新的內(nèi)存空間):
for k, _ := range input { c <- &input[k] }
再次運(yùn)行,就可看到預(yù)期的效果。以上方案是用于討論 range 語(yǔ)句帶來(lái)的問(wèn)題,當(dāng)然,平時(shí)還是盡量避免使用指針類(lèi)型的通道。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Go語(yǔ)言異步API設(shè)計(jì)的扇入扇出模式詳解
這篇文章主要為大家介紹了Go語(yǔ)言異步API設(shè)計(jì)的扇入扇出模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08golang?metrics各個(gè)指標(biāo)含義講解說(shuō)明
這篇文章主要為大家介紹了golang?metrics各個(gè)指標(biāo)含義講解說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05golang調(diào)用shell命令(實(shí)時(shí)輸出,終止)
本文主要介紹了golang調(diào)用shell命令(實(shí)時(shí)輸出,終止),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Go生成base64圖片驗(yàn)證碼實(shí)例(超詳細(xì)工具類(lèi))
這段時(shí)間需要使用圖片驗(yàn)證碼庫(kù),下面這篇文章主要給大家介紹了關(guān)于Go生成base64圖片驗(yàn)證碼的相關(guān)資料,文中給出了詳細(xì)的實(shí)例代碼,需要的朋友可以參考下2023-06-06go判斷文件夾是否存在并創(chuàng)建的實(shí)例
這篇文章主要介紹了go判斷文件夾是否存在,并創(chuàng)建的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12go語(yǔ)言的panic和recover函數(shù)用法實(shí)例
今天小編就為大家分享一篇關(guān)于go語(yǔ)言的panic和recover函數(shù)用法實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04