使用指向通道的指针是一种好的做法吗?例如,我同时读取数据,并使用通道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个 map 中将有大约数百万个数据,而且它将是多个 map .

因此,我认为如果我可以将指针传递给函数,这样它就不会复制数据以节省内存资源,这将是一个很好的方法.

我在effective go年里没有找到一个好的练习.所以我对我的方法有点怀疑.

推荐答案

为了提高效率,最好使用指向通道、映射、函数、接口或切片的指针.

这些类型的值具有与值的长度或容量无关的小的固定大小.内部指针引用可变大小的数据.

通道、贴图和函数的大小与指针相同.因此,复制这些类型的值的运行时成本与复制指向该值的指针相同.

接口是指针大小的两倍,切片是指针大小的三倍.复制这些类型的值的成本高于复制指针.额外的复制成本通常低于或等于取消引用指针的成本.

Go相关问答推荐

golang父进程的副本无法进行https/tls调用并获得tls:未能验证证书""

Go Regexp:匹配完整的单词或子字符串,或者根本不匹配

减少在围棋中映射DTO时的重复代码量

从 wincrypt API 到 Go 的 RC2 解密

这种合并排序的实现有什么问题?

Kperf 构建失败

如何为ANTLR4目标Go调试监听器

如何在 Go 中将 int 转换为包含 complex128 的泛型类型?

如何将验证器标记添加到嵌套字段

Opensearch 错误 ping 弹性服务器:由未知权威签署的 x509 证书

如何处理 Go 的 firebase admin sdk 错误?

grpc-gateway:重定向与定义不匹配(原始文件)

io.Pipe 使用困难

try 运行 docker-compose up -d 时出现错误

panic :拨号 tcp:在 172.22.64.1:53 上查找 bookstoreDB:没有这样的主机

如何在 Go 中使用 Pact 返回错误请求(400、500)?

Dynamodb.ScanInput - 不能使用expr.Names()(类型 map[string]*string)作为类型 map[string]string

函数参数的判断顺序是什么?

golangci-lint 的 GitHub 操作失败,无法加载 fmt

如何解决在mac m1中运行gcc失败退出状态1?