关闭可能是 os.Stdin 的 io.Reader

Jef*_*erg 0 go

如果给出了文件名,我尝试将文件设置为输入;如果未给出文件名,则使用标准输入。我本以为这是这样做的方法:

var input io.Reader
if filename == "" {
  input = os.Stdin
} else {
  input, err = os.Open(filename)
  if err != nil {
    log.Fatalf("failed to open file: %v", err)
  }
}
Run Code Online (Sandbox Code Playgroud)

传递的函数input需要符合接口的东西io.Reader并且一切都表现良好。就是上面的作品...

它一直有效,直到我试图找到一种关闭方法input。尽管 os.Stdin 和 os.Open 返回了这两件事(当然,关闭 stdin 可能没有多大意义,但它是无害的)。编译器不知道这两种创建方式input都会给我一些实现 Close() 的东西。所以我想知道有没有一种方法可以告诉编译器是Close()input.

Cer*_*món 5

使用io.ReadCloser声明input具有 Read 和 Close 方法:

var input io.ReadCloser
if filename == "" {
  input = os.Stdin
} else {
  input, err = os.Open(filename)
  if err != nil {
    log.Fatalf("failed to open file: %v", err)
  }
}
Run Code Online (Sandbox Code Playgroud)

如果文件在函数返回之前关闭,则另一个选择是推迟文件关闭:

var input io.Reader
if filename == "" {
  input = os.Stdin
} else {
  f, err := os.Open(filename)
  if err != nil {
    log.Fatalf("failed to open file: %v", err)
  }
  defer f.Close()
  input = f
}
Run Code Online (Sandbox Code Playgroud)