我有一个修改我的配置文件的 go 程序。我试图从 main() 函数中创建一个文件锁,但它抛出了一个panic: runtime error: invalid memory address or nil pointer dereference错误。没有锁,程序按预期工作正常。抛出异常的那段代码是lockProgram, err := os.Create("/var/.daemon.lock")defer lockProgram.Close()CheckForError(err)GetLock(lockProgram, syscall.LOCK_EX)defer UngetLock(lockProgram)//这是在一个单独的包中func CheckForError(e error) { if e != nil { Error.Println(e) panic(e) }}func GetLock(file *os.File, locktype int ) { fmt.Println("Acquiring lock on ", file.Name()) syscall.Flock(int(file.Fd()), locktype) fmt.Println("Acquired filelock on ", file.Name())}func UngetLock(file *os.File) { syscall.Flock(int(file.Fd()), syscall.LOCK_UN);}flock当我在我的配置文件上调用它时,这同样有效,但是来自不同的包,而不是主包,但是当我尝试从主包中放置锁时会抛出相同的错误。请帮我找出我在这里做错了什么。
1 回答
米琪卡哇伊
TA贡献1998条经验 获得超6个赞
当创建锁时发生错误时,lockProgram将是nil. 这将导致后续(延迟)调用lockProgram.Close()失败。
请注意,当您恐慌时(例如在您的CheckForError函数中),仍然会执行延迟的方法调用。这在这篇博客文章中有详细解释(重点是我的):
Panic 是一个内置函数,它停止普通的控制流并开始恐慌。当函数 F 调用 panic 时,F 的执行停止,F 中任何延迟的函数都会正常执行,然后 F 返回到它的调用者。对于调用者来说,F 的行为就像是调用 panic。该过程继续向上堆栈,直到当前 goroutine 中的所有函数都返回,此时程序崩溃。
解决方法:先检查错误,再延迟Close()调用:
lockProgram, err := os.Create("/var/.daemon.lock")
CheckForError(err)
defer lockProgram.Close()
- 1 回答
- 0 关注
- 127 浏览
添加回答
举报
0/150
提交
取消