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

时间:2013-09-09 12:15:52

标签: go

以下作为打开文件的功能

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:undefined:file

但是,如果我稍微改变一下,那就可以了。

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

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

2 个答案:

答案 0 :(得分:34)

  

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

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

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

答案 1 :(得分:7)

Mostafa已经指出file变量未在if块中定义,您已经看到了如何修复它。

但是你的功能有两个更重要的问题。

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

您可以通过将其更改为

来解决此问题
func openFile(filename string) *os.File, error {
     ... implementation
     return file, nil
}

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