关闭文件,然后在golang中将其重命名

关闭文件,然后在golang中将其重命名,go,deferred,Go,Deferred,当我对golang执行一些文件操作时,我首先打开一个文件并将close()添加到延迟列表中,然后尝试重命名该文件。如果我手动关闭该文件,延迟将再次关闭它。如果我等待延迟关闭它,重命名将导致错误,因为它没有关闭yey。代码如下 func main() { pfile1, _ := os.Open("myfile.log") defer pfile1.Close() //It will be closed again. ... ... pfile1.Clos

当我对golang执行一些文件操作时,我首先打开一个文件并将close()添加到延迟列表中,然后尝试重命名该文件。如果我手动关闭该文件,延迟将再次关闭它。如果我等待延迟关闭它,重命名将导致错误,因为它没有关闭yey。代码如下

func main() {

    pfile1, _ := os.Open("myfile.log")
    defer pfile1.Close() //It will be closed again.
    ...
    ...
    pfile1.Close() //I have to close it before rename it.
    os.Rename("myfile.log", "myfile1.log")
}
我发现了一些丑陋的解决方案,比如创建另一个函数来分隔打开的文件,下面有更好的解决方案吗

func main() {

    var pfile1 *os.File
    ugly_solution(pfile1)

    os.Rename("myfile.log", "myfile1.log")
}

func ugly_solution(file *os.File) {
    file, _ = os.Open("myfile.log")
defer file.Close()
}

关于您的代码,有一些事情我还不清楚

首先,为什么要在重命名文件之前打开它?这不是函数所必需的。该函数接受两个表示新旧文件名的字符串,无需传递文件指针

func main() {
    ...
    ...
    os.Rename("myfile.log", "myfile1.log")
}
假设您需要更改文件内容(考虑到
丑陋的解决方案
方法,情况似乎并非如此),并且必须打开文件,那么为什么要推迟
file.Close()
?如果需要在同一方法中的某个地方显式调用该方法,则不必延迟该方法。简单地说

func main() {
    pfile1, _ := os.Open("myfile.log")
    ...
    ...
    pfile1.Close()
    os.Rename("myfile.log", "myfile1.log")
}

关于您的代码,有一些事情我还不清楚

首先,为什么要在重命名文件之前打开它?这不是函数所必需的。该函数接受两个表示新旧文件名的字符串,无需传递文件指针

func main() {
    ...
    ...
    os.Rename("myfile.log", "myfile1.log")
}
假设您需要更改文件内容(考虑到
丑陋的解决方案
方法,情况似乎并非如此),并且必须打开文件,那么为什么要推迟
file.Close()
?如果需要在同一方法中的某个地方显式调用该方法,则不必延迟该方法。简单地说

func main() {
    pfile1, _ := os.Open("myfile.log")
    ...
    ...
    pfile1.Close()
    os.Rename("myfile.log", "myfile1.log")
}

您可以将关闭和重命名文件放在“延迟”中:

func main() { 
    pfile1, _ := os.Open("myfile.log")
    defer func(){
        pfile1.Close()
        os.Rename("myfile.log", "myfile1.log")   
    }() 
    ...
    ...
}

您可以将关闭和重命名文件放在“延迟”中:

func main() { 
    pfile1, _ := os.Open("myfile.log")
    defer func(){
        pfile1.Close()
        os.Rename("myfile.log", "myfile1.log")   
    }() 
    ...
    ...
}

在你的样品中这样的情况下

也许您希望遵循以下场景:

  • 轻松创建可识别的临时文件
  • 写下数据
  • 关闭文件
  • 如果成功,请重命名该文件
在这种情况下,如果您希望跟踪底层文件的操作系统操作,您可能只希望不延迟关闭IO.file,因为您希望获得关闭函数本身返回的错误

此外,在这种情况下,您可能还需要操作file.sync()


请参见示例中的情况

也许您希望遵循以下场景:

  • 轻松创建可识别的临时文件
  • 写下数据
  • 关闭文件
  • 如果成功,请重命名该文件
在这种情况下,如果您希望跟踪底层文件的操作系统操作,您可能只希望不延迟关闭IO.file,因为您希望获得关闭函数本身返回的错误

此外,在这种情况下,您可能还需要操作file.sync()


请参见

您为什么要推迟调用
Close()
?如果您必须调用它,您可以不使用defer?为什么您要将调用推迟到
Close()
?如果你必须调用它,你可以不使用延迟?是的,我想对文件进行更改,然后重命名它。根据建议,它不会添加Close()来延迟。但是,如果在Open()和Close()之间出现死机,那么delfer将不会调用Close(),然后将执行分为两部分。执行文件修改的零件,可在其中打开/编辑/关闭,以及可在其中重命名的零件。不要把所有的意图混为一谈,谢谢你的建议。拆分和不混合的意图是一个很好的方法。是的,我想对文件进行更改,然后重命名它。根据建议,它不会添加Close()来延迟。但是,如果在Open()和Close()之间出现死机,那么delfer将不会调用Close(),然后将执行分为两部分。执行文件修改的零件,可在其中打开/编辑/关闭,以及可在其中重命名的零件。不要把所有的意图混为一谈,谢谢你的建议。拆分和不混合的意图是一个很好的方法。但是当函数退出时会调用重命名,也许我想在重命名后添加更多的代码。它将不灵活。但重命名将在函数退出时调用,也许我想在重命名后添加更多代码。它不会灵活。