前言
成都創(chuàng)新互聯是少有的網站設計、做網站、營銷型企業(yè)網站、小程序制作、手機APP,開發(fā)、制作、設計、買鏈接、推廣優(yōu)化一站式服務網絡公司,2013年開創(chuàng)至今,堅持透明化,價格低,無套路經營理念。讓網頁驚喜每一位訪客多年來深受用戶好評
在Golang中使用 for range 語句進行迭代非常的便捷,但在涉及到指針時就得小心一點了。
下面的代碼中定義了一個元素類型為 *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 數組發(fā)送給 ch 通道,接收方再從 ch 通道中接收數據,程序的預期輸出應該是:
現在運行一下程序,得到的輸出如下:
很明顯,程序并沒有達到預期的結果,那么問題出在哪里呢?我們將代碼稍作修改:
//receiver for v := range ch { fmt.Println(v) }
得到如下輸出:
0x416020
0x416020
0x416020
0x416020
0x416020
可以看到,5次輸出變量 v ( *int )都指向了同一個地址,返回去檢查一下發(fā)送部分代碼:
for _, v := range input { ch <- &v }
問題正是出在這里,在 for range 語句中, v 變量用于保存迭代 input 數組所得的值,但是 v 只被聲明了一次,此后都是將迭代 input 出的值賦值給 v , v 變量的內存地址始終未變,這樣再將 v 的地址發(fā)送給 ch 通道,發(fā)送的都是同一個地址,當然無法達到預期效果。
解決方案:
引入一個中間變量,每次迭代都重新聲明一個變量 temp ,賦值后再將其地址發(fā)送給 ch :
for _, v := range input { temp := v ch <- &temp }
抑或直接引用數據的內存(推薦,無需開辟新的內存空間):
for k, _ := range input { c <- &input[k] }
再次運行,就可看到預期的效果。以上方案是用于討論 range 語句帶來的問題,當然,平時還是盡量避免使用指針類型的通道。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯的支持。
文章名稱:關于Golang中range指針數據的坑詳解
標題鏈接:http://chinadenli.net/article32/gisgsc.html
成都網站建設公司_創(chuàng)新互聯,為您提供網站收錄、定制網站、網站設計公司、全網營銷推廣、網站排名、
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯