23

以下作为打开文件的函数

func openFile(filename string) {
  var file *os.File
  var err error
  if file, err = os.Open(filename); err != nil {
    log.Printf("Failed to open the file: %s.", filename)
    return
  }
  defer file.Close()
  // blahblahblah
}

但是,当我尝试使用 := 声明变量文件时,这不起作用

func updateFrequencies(filename string, frequencyForWord map[string]int) {
  if file, err := os.Open(filename); err != nil {
     ....
  }
}

错误:./word_frequencies_2.go:30:未定义:文件

但如果我稍微改变一下,这有效

file, err := os.Open(filename)
if err != nil {
   log.Printf("Failed to open the file: %s.", filename)
   return
}

为什么我不能使用 := 作为 if 语句的一部分?

4

2 回答 2

41

为什么我不能使用 := 作为 if 语句的一部分?

你可以,但是变量是在块的范围内定义的if。因此,file未在您的if块之外定义。

相同的规则适用于forswitch和类似块中的定义。

于 2013-09-09T12:20:36.257 回答
7

Mostafa 已经指出该file变量不是在if块之外定义的,您已经看到了如何解决这个问题。

但是你的函数还有两个更重要的问题。

第一个是它不返回任何东西。

您可以通过将其更改为来解决此问题

func openFile(filename string) *os.File, error {
     ... implementation
     return file, nil
}

但这会让另一个:当你的函数结束时,它会关闭文件,因为 defer file.Close()这个函数的用户会收到一个关闭的文件。事实是您的功能没有真正意义。您可以通过让它传递将使用该文件的回调或让用户关闭文件来修复它,但正确的做法是直接在您需要的地方打开文件。

于 2013-09-09T12:21:03.070 回答