Golang中的:=运算符和if语句

26
以下是一个打开文件的函数:
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
}

然而,当我尝试使用:=来声明变量file时,这种方法不起作用。

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

错误:./word_frequencies_2.go:30行:未定义:file

但是,如果我稍微改变一下,这个就可以工作了。

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

为什么我不能在if语句中使用:=?

2个回答

45
为什么我不能在if语句中使用:= ?
你可以使用,但这样变量就只能被定义在if块内部的范围内。因此,file在if块之外是未定义的。
同样的规则也适用于for、switch和类似块中的定义。

7

Mostafa已经指出file变量在if块之外未定义,你已经知道如何修复。

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

第一个问题是它没有返回任何内容。

你可以通过将其更改为以下内容来解决:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接