2017-06-04 55 views
2

使用指向通道的指針是否很好?例如,我同時讀取數據並使用通道map[string]sting傳遞這些數據,並在getSameValues()內處理此通道。使用指向通道的指針

func getSameValues(results *chan map[string]string) []string { 
    var datas = make([]map[string]string, len(*results)) 
    i := 0 
    for values := range *results { 
     datas[i] = values 
     i++ 
    } 
} 

我這樣做是因爲chan map[string]string會有數以百萬計的地圖數據裏面的,這將是一個以上的地圖的原因。

所以我認爲這將是一個很好的方法,如果我可以傳遞指向該函數的指針,以便它不會複製數據以保存一些內存資源。

我在effective go沒有找到好的做法。所以我有點懷疑我的方法在這裏。

回答

4

通常不是使用指向通道的指針。

通道值的大小等於指針的大小。大小與通道中值的數量無關。

您不會通過使用指向通道的指針來減少複製,因爲複製指針與複製通道的成本相同。

0

在Go中,有五種類型的值通過引用而不是按值傳遞。這些是指針,切片,地圖,通道和接口。

複製引用值和複製指針在CPU的實際操作方面應該被認爲是相等的(至少是一個很好的近似值)。

因此,使用指向通道的指針幾乎沒有用處,就像使用指向映射的指針很少有用一樣。

因爲你的頻道載入地圖,頻道是一個引用類型,地圖也是這樣,所以CPU所做的就是在堆周圍複製指針。在通道的情況下,它也會進行goroutine同步。

如需進一步閱讀,請打開Effective Go並在頁面中搜索「參考」一詞。

+2

「通過引用傳遞的五種價值類別」---實際上Go中的所有內容都是按值傳遞的。 https://golang.org/doc/faq#pass_by_value「與C系列中的所有語言一樣,Go中的所有內容都是有價值的。」 – zerkms

+0

是的,這可能是我過分簡化了:五個類別都是引用類型,複製引用(或傳遞引用參數)不會複製它引用的內容。有人可能會爭辯說,所有事情都是有價值的,從另一個角度來說,這是過度簡化。我需要了解我對傳遞的參數所做的更改是否會超出值的範圍。 –