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
相关产品推荐
相关产品推荐

