Pointers 返回Golang中的文件指针
我还在努力学习Golang的基础知识 考虑以下示例代码:Pointers 返回Golang中的文件指针,pointers,go,Pointers,Go,我还在努力学习Golang的基础知识 考虑以下示例代码: func OpenOutputFile(name string) (fp *os.File) { fp, err := os.Create(name) if err != nil { panic(err) } defer func() { if err := fp.Close(); err != nil { panic(err) } }() return
func OpenOutputFile(name string) (fp *os.File) {
fp, err := os.Create(name)
if err != nil {
panic(err)
}
defer func() {
if err := fp.Close(); err != nil {
panic(err)
}
}()
return fp
}
我会假设:
fp := OpenOutputFile("output.txt")
现在将使fp
成为文件指针(*os.file
),这样我就可以调用如下语句:
io.WriteString(fp, "Hello World")
在另一个功能中。但调用此方法时,会生成错误:
0 write output.txt: bad file descriptor
因此,返回的指针似乎无效。如何返回格式正确的指针以用于io.WriteString
我感谢你的帮助
注意:当文件指针的创建和对文件指针的写入存在于同一个方法中时,所有操作都会按预期执行。将逻辑分解为函数会导致其行为不符合预期
“defer”语句调用其执行被延迟到的函数
由于
函数执行了一个return语句,到达
它的函数体,或者因为相应的goroutine是
惊慌失措
每次执行“defer”语句时,函数值和
调用的参数按常规计算并重新保存,但
未调用实际函数。相反,延迟函数是
在周围函数返回之前立即调用,在
相反,他们被推迟了。如果是延迟函数值
计算结果为nil,在调用函数时执行恐慌,而不是
当执行“defer”语句时
例如,如果延迟函数是一个函数文本
周围函数具有范围内的命名结果参数
在文本中,延迟函数可以访问和修改
返回前的结果参数。如果延迟函数
如果有任何返回值,则在函数完成时将丢弃这些值
你打开这个文件
fp, err := os.Create(name)
你关闭文件
err := fp.Close()
在
关闭
之后,fp
不再指向有效的文件描述符。Ahhh我不知道为什么我没有早点想到这一点。我以为在出现错误或其他情况时调用了defer()
。非常感谢。您不需要命名返回值。您在那里创建的变量fp被您在调用fp,err:=os.create(name)
@user1431317时创建的变量fp隐藏:您声称fp,err:=os.create(name)
创建变量fp
是错误的:与常规变量声明不同,短变量声明可以重新声明具有相同类型的同一块(如果块是函数体,则为参数列表)中最初声明的变量,并且至少有一个非空变量是新的。重新声明不会引入新变量;它只是给原始值赋值。你是对的,因为它们在同一个块中。但你仍然不需要说出它的名字。
err := fp.Close()