为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang 中返回文件指针

在 Golang 中返回文件指针

Go
ibeautiful 2021-12-27 15:01:43
我仍在努力学习 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 fp}我会假设调用:fp := OpenOutputFile("output.txt")现在将创建fp一个文件指针 ( *os.File),以便我可以调用如下语句:io.WriteString(fp, "Hello World")在另一个函数中。但是调用这个方法的时候,报错了:0 write output.txt: bad file descriptor所以看起来返回的指针无效。我怎样才能返回一个正确格式的指针来使用io.WriteString?我感谢您的帮助!注意:当文件指针的创建和文件指针的写入存在于同一方法中时,一切都会按预期执行。将逻辑分解为函数会导致其行为不符合预期。
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

"defer" 语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻,因为周围函数执行了一个 return 语句,到达了它的函数体的末尾,或者因为相应的 goroutine 处于恐慌状态。


每次执行“defer”语句时,函数值和调用的参数都会像往常一样评估并重新保存,但不会调用实际的函数。相反,在周围函数返回之前立即调用延迟函数,以与它们延迟的相反顺序调用。如果延迟函数值计算为 nil,则在调用函数时执行会出现混乱,而不是在执行“延迟”语句时。


例如,如果延迟函数是函数文字,并且周围的函数具有在文字范围内的命名结果参数,则延迟函数可以在返回结果参数之前访问和修改结果参数。如果延迟函数有任何返回值,则在函数完成时将其丢弃。


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, err := os.Create(name)

你关闭文件


err := fp.Close()

之后Close,fp不再指向有效的文件描述符。


查看完整回答
反对 回复 2021-12-27
  • 1 回答
  • 0 关注
  • 253 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信