国产探花免费观看_亚洲丰满少妇自慰呻吟_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武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长沙县| 普安县| 宣化县| 德州市| 平南县| 临沭县| 区。| 上犹县| 博罗县| 商洛市| 和林格尔县| 唐河县| 平塘县| 息烽县| 澄江县| 阳西县| 兴宁市| 黔西县| 永春县| 壶关县| 仁布县| 龙陵县| 玉溪市| 西贡区| 新泰市| 嘉黎县| 建德市| 南丰县| 墨江| 崇左市| 华亭县| 巴东县| 海丰县| 尚志市| 东平县| 雅江县| 武陟县| 应用必备| 揭东县| 吉隆县| 水城县|