gpt4 book ai didi

go - 单 channel 和 select 语句死锁

转载 作者:IT王子 更新时间:2023-10-29 02:18:19 28 4
gpt4 key购买 nike

我有以下最小示例,由于死锁,在第一个命令行输入后退出:

package main     

import "fmt"
import "os"

func main() {
channel1 := make(chan string)

go func() {
var str string
for {
fmt.Fscanln(os.Stdin, &str)
channel1 <- str
}
}()

for {
select {
case str := <-channel1:
fmt.Printf("Channel1 said: %v\n", str)
}
}
}

我原以为这只是接受用户输入并一遍又一遍地回应它。此外,我确实注意到,如果我添加第二个 channel 和第二个 go 例程,它不会有任何死锁问题。那么为什么会出现这种僵局呢?

最佳答案

无法重现问题。

jnml@fsc-r630:~/src/tmp/SO/13015469$ cat main.go 
package main

import (
"fmt"
"os"
)

func main() {
channel1 := make(chan string)

go func() {
var str string
for {
fmt.Fscanln(os.Stdin, &str)
channel1 <- str
}
}()

for {
select {
case str := <-channel1:
fmt.Printf("Channel1 said: %v\n", str)
}
}
}
jnml@fsc-r630:~/src/tmp/SO/13015469$ go run main.go
foo
Channel1 said: foo
bar
Channel1 said: bar
baz
Channel1 said: baz
^Cjnml@fsc-r630:~/src/tmp/SO/13015469$ go build main.go && ./main
foo
Channel1 said: foo
bar
Channel1 said: bar
baz
Channel1 said: baz
^Cjnml@fsc-r630:~/src/tmp/SO/13015469$ go version
go version go1.0.3
jnml@fsc-r630:~/src/tmp/SO/13015469$ uname -a
Linux fsc-r630 3.2.0-32-generic #51-Ubuntu SMP Wed Sep 26 21:33:09 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
jnml@fsc-r630:~/src/tmp/SO/13015469$

您的 Go 版本、操作系统和架构是什么?

关于go - 单 channel 和 select 语句死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13015469/

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