Pointers 返回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

我还在努力学习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

我感谢你的帮助

注意:当文件指针的创建和对文件指针的写入存在于同一个方法中时,所有操作都会按预期执行。将逻辑分解为函数会导致其行为不符合预期

“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()