使用指向通道的指针

时间:2017-06-04 05:50:38

标签: go concurrency channel

使用指针指向频道是一种好习惯吗?例如,我同时读取数据并使用频道传递这些数据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找不到好的做法。所以我对这里的方法有点怀疑。

3 个答案:

答案 0 :(得分:10)

使用通道指针通常不是好习惯。

通道值的大小等于指针的大小。大小与通道中的值数无关。

您不会通过使用指向频道的指针来减少复制,因为复制指针的成本与复制频道的成本相同。

答案 1 :(得分:5)

在Go中,有五类值通过引用而不是值传递。这些是指针,切片,地图,通道和接口。

复制参考值和复制指针应该被视为CPU必须实际做的事情(至少作为一个很好的近似值)。

因此使用指向通道的指针几乎没用,就像使用指向地图的指针一样。

因为您的频道带有地图,所以频道是引用类型,地图也是如此,因此所有CPU正在做的是复制堆周围的指针。在通道的情况下,它也进行goroutine同步。

如需进一步阅读,请打开Effective Go并在页面中搜索'参考'。

答案 2 :(得分:2)

goland中的一切都通过价值传递。偶数指针是一种类型,并为其分配了内存地址的值。所以它们也是价值。

(扩展Rick的答案)实际上有 SIX 个类型,它们会隐藏指针值,而指向它们的指针(即,指向指针的指针)仍然无济于事:

fogtype = "exp2"