go - 是否可以通过关闭 src 来中断 io.Copy?
问题描述
代码示例:
package main
import (
"io"
"os"
"os/signal"
"sync"
"syscall"
)
func main() {
sigintCh := make(chan os.Signal, 1)
signal.Notify(sigintCh, syscall.SIGINT, syscall.SIGTERM)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
io.Copy(os.Stdout, os.Stdin)
}()
<-sigintCh
os.Stdin.Close()
wg.Wait()
}
如果运行此示例并尝试中断^C
它会等待任何输入并仅在向标准输入发送某些内容后停止(例如,只需按 enter)。
我希望关闭 Stdin 就像发送 EOF 一样,但它不起作用。
解决方案
关闭os.Stdin
将导致下次读取时io.Copy
返回错误(在 之后,尝试按)。file already closed
CTRL-C
Enter
如File.Close文档中所述:
Close 关闭文件,使其无法用于 I/O。
您不能通过os.Stdin
关闭它(或任何其他方式)来强制返回 EOF。相反,您需要包装os.Stdin
并实现自己的Read
有条件返回的方法EOF
,或者在循环中读取有限数量的字节。
您可以在这个golang-nuts线程上看到更多讨论和可能的解决方法。
推荐阅读
- python - 无法通过 python/selenium 查找/搜索链接并将它们保存到列表变量
- html - 如何在html中添加符号?
- assembly - 以下命令后的寄存器值
- javascript - 如何防止 JavaScript 将我的文本添加为数字
- ionic-framework - 如何将 Ionic v3 (3.9.1) navBar 后退按钮向右对齐?
- string - Lua string append function size versus hard-coded string
- azure - Adding users in Azure AD public client app
- neo4j - 日期时间和 iso 格式
- python - Python矩阵乘法 - 结果矩阵大小
- c# - Why are CascadingValue's null when accessing the page directly?