2012-10-22 26 views
1

我有第一个命令行输入后捞出由于僵局以下小例子:单通道和select语句僵局

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)  
     }            
    }    
} 

我本来期望这只是简单地采取用户输入和回声过来并重新开始。另外,我注意到如果我添加第二个频道和第二个去程序,它没有任何死锁问题。那么为什么会出现这种僵局呢?

回答

1

无法重现该问题。

[email protected]:~/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) 
     } 
    } 
} 
[email protected]:~/src/tmp/SO/13015469$ go run main.go 
foo 
Channel1 said: foo 
bar 
Channel1 said: bar 
baz 
Channel1 said: baz 
^[email protected]:~/src/tmp/SO/13015469$ go build main.go && ./main 
foo 
Channel1 said: foo 
bar 
Channel1 said: bar 
baz 
Channel1 said: baz 
^[email protected]:~/src/tmp/SO/13015469$ go version 
go version go1.0.3 
[email protected]:~/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 
[email protected]:~/src/tmp/SO/13015469$ 

什么是您的Go版本,操作系统&体系结构?

+0

我正在运行1.0.2,升级到1.0.3似乎已经解决了这个问题。感谢您指点我正确的方向! – Chris