校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 關于Golang中range指針數據的坑詳解

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

熱門標簽:浙江高速公路地圖標注 學海導航地圖標注 地圖標注的汽車標 江西轉化率高的羿智云外呼系統 中國地圖標注省會高清 南通如皋申請開通400電話 廣州呼叫中心外呼系統 高德地圖標注口訣 西部云谷一期地圖標注

前言

在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)
 }
}

在上面代碼中,發送方將 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 語句帶來的問題,當然,平時還是盡量避免使用指針類型的通道。

總結

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

您可能感興趣的文章:
  • Go語言應該什么情況使用指針
  • Go 語言的指針的學習筆記
  • Go語言中結構體方法副本傳參與指針傳參的區別介紹
  • golang中值類型/指針類型的變量區別總結
  • golang方法中receiver為指針與不為指針的區別詳析
  • Go語言中的指針運算實例分析
  • Go語言指針訪問結構體的方法
  • Go語言指針使用分析與講解

標簽:吐魯番 保定 貴州 許昌 東營 德宏 常州 曲靖

巨人網絡通訊聲明:本文標題《關于Golang中range指針數據的坑詳解》,本文關鍵詞  關于,Golang,中,range,指針,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《關于Golang中range指針數據的坑詳解》相關的同類信息!
  • 本頁收集關于關于Golang中range指針數據的坑詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 台北县| 宁都县| 合肥市| 渭南市| 永和县| 囊谦县| 桂东县| 喀什市| 和静县| 大荔县| 繁峙县| 页游| 镇雄县| 临沂市| 高尔夫| 桦川县| 永城市| 三穗县| 桦南县| 屏边| 宣城市| 潼南县| 湟源县| 岫岩| 洛扎县| 女性| 亳州市| 张掖市| 织金县| 忻城县| 丽水市| 成都市| 永新县| 霍城县| 宣恩县| 钟山县| 永福县| 石河子市| 隆尧县| 民勤县| 庆城县|