Go语言 不接受来自标准输入的重复输入

x4shl7ld  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(122)

我有一个人为的程序,目标是在标准输入中回显文本(你想回显多少次就回显多少次),并在10秒后退出。代码如下:

package main

import (
    "bufio"
    "fmt"
    "os"
    "time"
)

func main() {
    input := make(chan string)
    abort := make(chan bool)

    // exit after 10 sec
    go func() {
        time.Sleep(10 * time.Second)
        abort <- true
    }()

    go func() {
        cmd := bufio.NewScanner(os.Stdin)
        for cmd.Scan() {
            input <- "<- " + cmd.Text()
        }
    }()

    select {
    case <-abort:
        fmt.Println("exiting")
        return
    case cmd := <-input:
        fmt.Println(cmd)
    }
}

问题是当我输入第一行文本时,它被回显到stdout,程序退出。我想在10秒内输入任意多的命令。
我做错了什么?

r1zhe5dt

r1zhe5dt1#

中止通道在10秒后关闭,这使得第一个选择情况(<-中止)被触发并且程序退出。这是我得到的

func main() {
input := make(chan string)
abort := make(chan bool)

// exit after 10 sec
go func() {
    time.Sleep(10 * time.Second)
    close(abort) // Close the channel after 10 seconds
}()

go func() {
    cmd := bufio.NewScanner(os.Stdin)
    for cmd.Scan() {
        input <- "<- " + cmd.Text()
    }
}()

for {
    select {
    case <-abort:
        fmt.Println("closing connection")
        return
    case cmd := <-input:
        fmt.Println(cmd)
    }
}
}'

我使用'for'将外部select语句替换为无限循环。10秒超时后,我使用close(abort)语句关闭abort的通道。这将告诉select语句发生了超时,当通道关闭时,它应该继续第一种情况(<-abort)。我有一个塞齐尔打字,所以我希望你得到它。

相关问题