關於Golang中range指標資料的坑詳解

2021-09-28 14:00:03 字數 903 閱讀 4807

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

下面的**中定義了乙個元素型別為 *int 的通道 ch :

package main

import (

"fmt")

func main()

go func()

close(ch)

}()//receiver

for v := range ch

}

在上面**中,傳送方將 input 陣列傳送給 ch 通道,接收方再從 ch 通道中接收資料,程式的預期輸出應該是:

現在執行一下程式,得到的輸出如下:

很明顯,程式並沒有達到預期的結果,那麼問題出在**呢?我們將**稍作修改:

//receiver

for v := range ch

得到如下輸出:

0x66020

0x66020

0x66020

0x66020

0x66020

for _, v := range input
問題正是出在這裡,在 for range 語句中, v 變數用於儲存迭代 input 陣列所得的值,但是 v 只被宣告了一次,此後都是將迭代 input 出的值賦值給 v , v 變數的記憶體位址始終未變,這樣再將 v 的位址傳送給 ch 通道,傳送的都是同乙個位址,當然無法達到預期效果。

解決方案:

for _, v := range input
for k, _ := range input

Swift 中的Range型別和 Range運算子

swift中有五個最常用的range型別 closedrange a b range a 對應的,有五個range運算子,用來定義上面的range型別 closed range operator a b half open range operator a closedrange型別代表乙個閉區間 ...

golang中關於資源釋放

在golang程式設計中,建立資源後,比如開啟了檔案,獲取了資料庫的鏈結,或者是鎖資源,可以執行defer file.close defer connect.close 語句。在defer後,可以繼續使用建立資源,當函式完畢後,系統會依次從defer棧中取出語句關閉資源。這種機制非常簡潔,不用再為在...

關於golang中的切片詳解

之前對切片的理解是本身是乙個指標,指標指向陣列,因為陣列是值賦值,所以陣列作為函式引數傳遞時,會被複製乙份,傳遞較大陣列時會比較浪費記憶體。之前的理解部分對,但是瑕疵和錯誤的地方太多。切片本身是乙個結構體,它是被golang封裝過的結構體,所以使用起來和陣列差不多,其結構體內容如下 type sli...