:=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()
,因此此函数的用户会收到一个关闭的文件。事实是,你的函数没有真正意义。您可以通过让它通过使用该文件的回调来修复它,或者让用户关闭该文件,但正确的做法是在需要的地方直接打开该文件