我有一个精心设计的程序,目标是在stdin上 echo 文本(您想要的次数),并在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)
    }
}

问题是,当我输入第一行文本时,它被 echo 到标准输出,程序退出.我想在10秒内输入任意数量的命令.

我做错了什么?

推荐答案

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

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).我已经把它打出来了,所以我希望你能收到.

Go相关问答推荐

使用Gorm创建自定义连接表

如何修复在Go API中使用Gin Framework的请求资源上没有使用Gin Framework的请求源的消息?''

在保留额外参数的同时解封YAML

为什么工具链指令在这种情况下没有效果?

Go中的net.SplitHostPort(r.RemoteAddr)安全性

Golang使用Run()执行的命令没有返回

重新赋值变量时未清除动态类型-这是错误吗?

什么东西逃到了堆里?

如何在链接中写入链接

Golang telegram 机器人

在 GoLang 中对自定义 struct 体数组进行排序

生成一个 CSV/Excel,在 Golang 中该列的下拉选项中指定值

golang / urfave.cli:无法手动设置标志

go - 仅在函数即将返回错误时清理资源

使用 unsafe.Pointer 将 struct point直接转换为另一个 struct 是否安全?

SSH 代理,数据包长度错误

Go gmail api 快速入门导致本地主机拒绝连接 ERR_CONNECTION_REFUSED

grpc-gateway:重定向与定义不匹配(原始文件)

如何从 tinygo webassembly 目标返回对象

为什么 template.ParseFiles() 没有检测到这个错误?