以下作为打开文件的功能
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语句的一部分?
答案 0 :(得分:34)
为什么我不能使用:=作为if语句的一部分?
您可以,但变量是在if
块的范围内定义的。因此,file
未在if
块之外定义。
同样的规则适用于for
,switch
和类似区块中的定义。
答案 1 :(得分:7)
Mostafa已经指出file
变量未在if
块中定义,您已经看到了如何修复它。
但是你的功能有两个更重要的问题。
第一个是它不返回任何东西。
您可以通过将其更改为
来解决此问题func openFile(filename string) *os.File, error {
... implementation
return file, nil
}
但这会让另一个:当你的函数结束时,它会因defer file.Close()
而关闭文件,以便该函数的用户收到一个已关闭的文件。事实是,你的功能并没有真正意义。您可以通过让它通过使用该文件的回调或让用户关闭文件来修复它,但正确的做法是直接打开您需要的文件。