欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

關(guān)于Golang中range指針數(shù)據(jù)的坑詳解

前言

成都創(chuàng)新互聯(lián)是少有的網(wǎng)站設(shè)計(jì)、做網(wǎng)站、營銷型企業(yè)網(wǎng)站、小程序制作、手機(jī)APP,開發(fā)、制作、設(shè)計(jì)、買鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,2013年開創(chuàng)至今,堅(jiān)持透明化,價格低,無套路經(jīng)營理念。讓網(wǎng)頁驚喜每一位訪客多年來深受用戶好評

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

下面的代碼中定義了一個元素類型為 *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)該是:

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

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

//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 數(shù)組所得的值,但是 v 只被聲明了一次,此后都是將迭代 input 出的值賦值給 v , v 變量的內(nèi)存地址始終未變,這樣再將 v 的地址發(fā)送給 ch 通道,發(fā)送的都是同一個地址,當(dāng)然無法達(dá)到預(yù)期效果。

解決方案:

引入一個中間變量,每次迭代都重新聲明一個變量 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)然,平時還是盡量避免使用指針類型的通道。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。

文章名稱:關(guān)于Golang中range指針數(shù)據(jù)的坑詳解
標(biāo)題鏈接:http://www.chinadenli.net/article32/gisgsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄定制網(wǎng)站網(wǎng)站設(shè)計(jì)公司全網(wǎng)營銷推廣網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)