解释我们的Concurrency教程中为什么需要go例程

解释我们的Concurrency教程中为什么需要go例程,go,Go,在围棋之旅中,我很难理解goroutines和Channel的用法。参考以下代码: “” 我不明白为什么这里需要goroutine。我可能误解了这一概念,如果对围棋更熟悉的人能提供一些帮助,我将不胜感激 谢谢,其他人已经在评论中指出,作为示例,您显然不需要编写带有频道的程序 不过,从您的问题来看,您似乎很好奇为什么需要单独的goroutine才能运行程序 要回答这个问题,考虑一下在一个只考虑线程的世界中,这可能会有帮助。您已经有了主线程,该线程调用sum(s[:len(s)/2],c)。因此,现

在围棋之旅中,我很难理解goroutines和Channel的用法。参考以下代码:

“”

我不明白为什么这里需要goroutine。我可能误解了这一概念,如果对围棋更熟悉的人能提供一些帮助,我将不胜感激


谢谢,

其他人已经在评论中指出,作为示例,您显然不需要编写带有频道的程序

不过,从您的问题来看,您似乎很好奇为什么需要单独的goroutine才能运行程序

要回答这个问题,考虑一下在一个只考虑线程的世界中,这可能会有帮助。您已经有了主线程,该线程调用
sum(s[:len(s)/2],c)
。因此,现在主线程到达
c,这是不需要的。这只是goroutines如何工作的一个演示。在实际的应用程序中,你永远不会将goroutine用于如此简单的事情。它们不是“需要的”,而是如何使用它们的演示。没有它们它就失败的原因是发送永远被阻塞,因为没有其他的例行发送。
package main

import "fmt"

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c <- sum // send sum to c
}

func main() {
    s := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)
    go sum(s[:len(s)/2], c)
    go sum(s[len(s)/2:], c)
    x, y := <-c, <-c // receive from c

    fmt.Println(x, y, x+y)
}
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.sum(0xc420059f10, 0x3, 0x6, 0xc420088060)
    /tmp/compile33.go:10 +0x5a
main.main()
    /tmp/compile33.go:17 +0x99