Go 方法调用与通道调用的使用

Go 方法调用与通道调用的使用,go,concurrency,channel,goroutine,Go,Concurrency,Channel,Goroutine,我越来越熟悉Go的并发模式,我想澄清一下最佳实践 我知道我们希望使用沟通渠道 在两次狂欢之间。也就是说,在某些情况下 方法调用有意义,或者在每个 情况如何 在通信已处理的消息/结构时 (不是传递/注册的模块等)传递是否更好 按值排序,这样我们就不会冒修改两个goroutine的风险 它同时发生了吗 无法使用方法调用或函数调用与另一个goroutine通信。从goroutine调用函数时,该函数在调用它的goroutine中执行。您只能使用通道与另一个goroutine通信,或者通过共享内存和使用

我越来越熟悉Go的并发模式,我想澄清一下最佳实践

  • 我知道我们希望使用沟通渠道 在两次狂欢之间。也就是说,在某些情况下 方法调用有意义,或者在每个 情况如何
  • 在通信已处理的消息/结构时 (不是传递/注册的模块等)传递是否更好 按值排序,这样我们就不会冒修改两个goroutine的风险 它同时发生了吗

  • 无法使用方法调用或函数调用与另一个goroutine通信。从goroutine调用函数时,该函数在调用它的goroutine中执行。您只能使用通道与另一个goroutine通信,或者通过共享内存和使用sync包中的同步原语来防止争用情况

    问题的第二部分取决于情况

    g1:
    y:=<-ch
    
    g2:
    ch<-x
    
    g1:
    
    y:=您只能使用通道与另一个goroutine进行通信,这并不严格准确:您还可以通过共享内存访问进行通信。但是如果你这样做,你通常需要使用互斥锁。仍然不太正确——“或者通过共享内存在同步包中使用同步原语”是误导。您使用指针共享内存,而不是使用
    sync
    。为了避免竞争条件访问共享内存,您需要使用
    sync
    包同步该访问。两件不同的事情。@BurakSerdar您肯定需要指针来共享内存。否则,您如何让两个goroutine引用相同的内存?@Adrian i:=0;go func(){i++}();go func(){i--}很高兴看到人们讨论这个问题,至少给出一个理由。谢谢你,伙计。。