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

:=Golang中的运算符和if语句,go,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 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\u frequencies\u 2.go:30:未定义:文件

但如果我稍微改变一下,这就行了

file, err := os.Open(filename)
if err != nil {
   log.Printf("Failed to open the file: %s.", filename)
   return
}
为什么不能将:=用作if语句的一部分

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

可以,但是变量是在
if
块的范围内定义的。因此,
文件
不是在
if
块之外定义的


同样的规则也适用于
中对于
开关
和类似块的定义。

Mostafa已经指出
文件
变量不是在
if
块中定义的,您已经看到了如何修复它

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

第一,它不会返回任何东西

您可以通过将其更改为

func openFile(filename string) *os.File, error {
     ... implementation
     return file, nil
}
但这会导致另一个问题:当您的函数结束时,它会关闭文件,因为
defer file.Close()
,因此此函数的用户会收到一个关闭的文件。事实是,你的函数没有真正意义。您可以通过让它通过使用该文件的回调来修复它,或者让用户关闭该文件,但正确的做法是在需要的地方直接打开该文件