我有一个去程序,修改我的配置文件。我正在尝试从main()函数内创建一个文件锁,但它会抛出一个panic: runtime error: invalid memory address or nil pointer dereference
错误。没有锁定,程序正常工作正常。抛出异常的代码段是Golang flock filelocking引发恐慌:运行时错误:无效的内存地址或零指针取消引用
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
工作,但是从不同的包,不是主包,但是当我尝试从主包中放入锁时会抛出相同的错误。请帮助我找出我在这里做错了什么。
你调用检查错误之前推迟。如果出现错误,该文件将为零。 – JimB
@JimB,如果我错了,请纠正我,但推迟是堆叠的,只有在函数即将完成时才会执行,对吗?它可以造成问题吗? – nohup
这没关系。如果你的函数结束并且'lockProgram'为零,你会感到恐慌。如果你想推迟关闭,你需要检查错误并提前回来 – JimB