国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

關于Golang中range指針數據的坑詳解

2020-04-01 18:49:59
字體:
來源:轉載
供稿:網友

前言

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

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

package mainimport ( "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) }}

在上面代碼中,發送方將 input 數組發送給 ch 通道,接收方再從 ch 通道中接收數據,程序的預期輸出應該是:

現在運行一下程序,得到的輸出如下:

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

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

得到如下輸出:

0x416020
0x416020
0x416020
0x416020
0x416020

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

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

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

解決方案:

引入一個中間變量,每次迭代都重新聲明一個變量 temp ,賦值后再將其地址發送給 ch : 

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

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

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

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永福县| 衡水市| 南安市| 盘山县| 汝南县| 阜宁县| 嘉义县| 商丘市| 青龙| 泊头市| 新邵县| 太白县| 陆河县| 新龙县| 连平县| 河南省| 绥滨县| 鹿泉市| 道孚县| 日照市| 汝州市| 永吉县| 威信县| 北安市| 正定县| 新晃| 衡阳市| 莎车县| 萍乡市| 年辖:市辖区| 启东市| 长葛市| 同江市| 张北县| 河北区| 方城县| 开封市| 五华县| 邹平县| 攀枝花市| 仁怀市|