Go编程语言代码错误

Go编程语言代码错误,go,Go,我尝试用GO编写一个简单的代码,其中两个GO例程(Send和Receive)相互发送整数。我给出下面的代码。有谁能帮我解释一下为什么这个程序的输出是[没有输出]。有什么愚蠢的错误吗(对不起,我是围棋新手) 主程序包 func Send(in1这个怎么样: package main func Send (ch chan<- int) { for i := 0; i < 10; i++ { print(i, " sending\n") ch <-

我尝试用GO编写一个简单的代码,其中两个GO例程(Send和Receive)相互发送整数。我给出下面的代码。有谁能帮我解释一下为什么这个程序的输出是[没有输出]。有什么愚蠢的错误吗(对不起,我是围棋新手)

主程序包
func Send(in1这个怎么样:

package main

func Send (ch chan<- int) {
    for i := 0; i < 10; i++ {
      print(i, " sending\n")
      ch <- i
    }
}

func Receive (ch <-chan int) {
    for i := 0; i < 10; i++ {
        print(<-ch, " received\n")
    }
}

func main() {
   ch := make(chan int)
   go Receive(ch)
   Send(ch)
}
我不知道为什么从来没有收到过9。应该有办法让主线程休眠,直到接收goroutine完成。而且,接收者和发送者都知道他们将发送10个号码,这是不雅的。一个goroutine应该在另一个goroutine完成其工作后关闭。我不确定如何继续哦,那个

EDIT1:

这是一个具有两个通道的实现,go例程在彼此之间来回发送int。其中一个被指定为响应者,仅在接收int后发送and int。响应者只需将两个int添加到他接收的int中,然后将其发送回

package main

func Commander(commands chan int, responses chan int) {
    for i := 0; i < 10; i++ {
      print(i, " command\n")
      commands <- i
      print(<-responses, " response\n");
    }
    close(commands)
}

func Responder(commands chan int, responses chan int) {
    for {
        x, open := <-commands
        if !open {
            return;
        }
        responses <- x + 2
    }
}

func main() {
   commands := make(chan int)
   responses := make(chan int)
   go Commander(commands, responses)
   Responder(commands, responses)
}
这个怎么样:

package main

func Send (ch chan<- int) {
    for i := 0; i < 10; i++ {
      print(i, " sending\n")
      ch <- i
    }
}

func Receive (ch <-chan int) {
    for i := 0; i < 10; i++ {
        print(<-ch, " received\n")
    }
}

func main() {
   ch := make(chan int)
   go Receive(ch)
   Send(ch)
}
我不知道为什么从来没有收到过9。应该有办法让主线程休眠,直到接收goroutine完成。而且,接收者和发送者都知道他们将发送10个号码,这是不雅的。一个goroutine应该在另一个goroutine完成其工作后关闭。我不确定如何继续哦,那个

EDIT1:

这是一个具有两个通道的实现,go例程在彼此之间来回发送int。其中一个被指定为响应者,仅在接收int后发送and int。响应者只需将两个int添加到他接收的int中,然后将其发送回

package main

func Commander(commands chan int, responses chan int) {
    for i := 0; i < 10; i++ {
      print(i, " command\n")
      commands <- i
      print(<-responses, " response\n");
    }
    close(commands)
}

func Responder(commands chan int, responses chan int) {
    for {
        x, open := <-commands
        if !open {
            return;
        }
        responses <- x + 2
    }
}

func main() {
   commands := make(chan int)
   responses := make(chan int)
   go Commander(commands, responses)
   Responder(commands, responses)
}

大卫·格雷森(David Grayson)的修复方案是可行的,但解释为什么
9
并不总是被接受的解释并不适合评论

当发送goroutine在通道上发送值时,它将阻塞,直到接收goroutine接收到该值。此时,它将被解除阻塞。go计划程序可能会在给接收goroutine打印任何内容的机会之前立即从main返回。如果将GOMAXPROCS设置为大于1的值,则发生这种情况的频率会降低因为主goroutine处于活动状态时,接收goroutine不会阻塞

如果要在所有goroutine完成之前停止main返回,可以从
Receive()
返回一个频道,如下所示:

package main

import "fmt"

func Send(ch chan<- int) {
    for i := 0; i < 10; i++ {
        fmt.Println(i, " sending")
        ch <- i
    }
    close(ch)
}

func Receive(ch <-chan int) (<-chan bool) {
    done := make(chan bool)
    go func() {
        for {
            i, ok := <-ch
            if !ok {
                break
            }
            fmt.Println(i, " received")
        }
        done <- true
    }()
    return done
}

func main() {
    ch := make(chan int)
    d := Receive(ch)
    Send(ch)
    _ = <-d
}
主程序包
输入“fmt”

func Send(ch chanDavid Grayson的修复程序有效,但解释为什么
9
不总是收到的解释不适合评论

当发送goroutine在通道上发送值时,它将阻塞,直到接收goroutine接收到该值。此时,它将被解除阻塞。go计划程序可能会在给接收goroutine打印任何内容的机会之前立即从main返回。如果将GOMAXPROCS设置为大于1的值,则发生这种情况的频率会降低因为主goroutine处于活动状态时,接收goroutine不会阻塞

如果要在所有goroutine完成之前停止main返回,可以从
Receive()
返回一个频道,如下所示:

package main

import "fmt"

func Send(ch chan<- int) {
    for i := 0; i < 10; i++ {
        fmt.Println(i, " sending")
        ch <- i
    }
    close(ch)
}

func Receive(ch <-chan int) (<-chan bool) {
    done := make(chan bool)
    go func() {
        for {
            i, ok := <-ch
            if !ok {
                break
            }
            fmt.Println(i, " received")
        }
        done <- true
    }()
    return done
}

func main() {
    ch := make(chan int)
    d := Receive(ch)
    Send(ch)
    _ = <-d
}
主程序包
输入“fmt”

func发送(请在发布前修正缩进。在发布前修正缩进。谢谢David Grayson。这很酷。但是,我实际上想做的是发送例程发送int以接收例程,并从中接收int。这意味着双向通信通道。是否可能?发送例程应在发送最后一个整数后关闭通道,当接收到来自频道的新值时,接收者应该检查关闭的频道:@arpsss:你需要两个频道。请随意加入我的答案。所有这些内容都不适合在这里的评论中:)好的!请在我的回答中查看EDIT1;我已经合并了您的评论,arpsss和@mkb。谢谢David Grayson。这很酷。但是,我实际上想做的是发送例程发送int到接收例程,并从中接收int。这意味着双向通信通道。有可能吗?发送例程应该在发送las后关闭通道t integer,接收器在从通道接收新值时应检查封闭通道:@arpsss:您需要两个通道。请随意合并我的答案。所有这些内容都不适合在此处添加注释:)好的!请在我的答案中查看EDIT1;我已合并了您的注释、arpsss和@mkb。