gpt4 book ai didi

Goroutine channel ,复制 vs 指针

转载 作者:行者123 更新时间:2023-12-01 22:40:12 26 4
gpt4 key购买 nike

这两个函数都在执行相同的任务,即初始化“数据结构”。每个功能的优点或缺点是什么?例如该函数应该解码一个大的 JSON 文件。

package main

type Data struct {
i int
}

func funcp(c chan *Data) {
var t *Data
t = <-c //receive
t.i = 10
}

func funcv(c chan Data) {
var t Data
t.i = 20
c <- t //send
}

func main() {
c := make(chan Data)
cp := make(chan *Data)

var t Data

go funcp(cp)
cp <- &t //send
println(t.i)

go funcv(c)
t = <- c //receive
println(t.i)
}

Link to Go Playground

最佳答案

你的问题的标题似乎是错误的。您不是在询问交换事物,而是询问是否发送指向某些数据的指针或某些数据的副本。更重要的是,您问题的整体主旨缺乏关键信息。

考虑两个类比:

  • 哪个更好,巧克力冰淇淋还是草莓?这可能是一个见仁见智的问题,但至少两者都有相似的目的。
  • 哪个更好,一 jar 胶水还是一 block C4 砖?这取决于你是想 build 一些东西,还是炸毁一些东西,不是吗?

  • 如果您通过 channel 发送数据副本,接收者将获得……副本。接收方无权访问原件。复制过程可能需要一些时间,但接收者不必共享访问权限这一事实可能会加快速度。所以这是一种观点,如果您的问题是关于哪个更快,那么您必须对其进行基准测试。一定要对真正的问题进行基准测试,而不是玩具示例,因为玩具示例的基准测试并不能转化为真实世界的性能。

    如果您通过 channel 发送指向数据的指针,则接收方会获得指针的副本,因此可以修改原始数据。复制指针很快,但接收者必须共享访问的事实可能会减慢速度。但是如果接收者必须能够修改数据,你就别无选择。您必须使用有效的工具,而不是无效的工具。

    在您的两个函数中,一个生成值( funcv ),因此它不必发送指针。这很好,并为您提供了选择。另一个( funcp )接收对象但想要更新它们,因此它必须接收指向底层对象的指针。这也很好,但这意味着您现在通过共享(底层数据结构)进行通信,这需要仔细协调。

    关于Goroutine channel ,复制 vs 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61997233/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com