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