You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言如何关闭可能为os.Stdin的io.Reader类型实例

解决方案

你要的效果有两种常用实现方式:

方案1:直接声明为io.ReadCloser类型

既然两个分支的返回值都同时实现了io.Reader和io.Closer接口,直接把变量类型替换成io.ReadCloser即可,编译器会自动校验接口实现,你后续可以直接调用Close()方法:

var input io.ReadCloser
if filename == "" {
  input = os.Stdin
} else {
  var err error
  input, err = os.Open(filename)
  if err != nil {
    log.Fatalf("failed to open file: %v", err)
  }
}
// 后续直接调用Close即可
defer input.Close()

这种方式最简洁,只要你后续用到input的地方接受io.Reader类型完全没问题,因为io.ReadCloser是io.Reader的超集,可以直接传进去。

方案2:类型断言动态判断(适合必须保留io.Reader声明的场景)

如果因为现有代码逻辑限制不能修改input的类型声明,可以在关闭的时候用类型断言判断是否实现了io.Closer接口,再执行关闭操作,这种写法兼容性更强,就算后续input换成其他不支持关闭的Reader实现也不会报错:

// 输入逻辑保持不变,input还是io.Reader类型
defer func() {
  if closer, ok := input.(io.Closer); ok {
    _ = closer.Close()
  }
}()

内容的提问来源于stack exchange,提问作者Jeffrey Goldberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:09:03