【发布时间】:2016-01-10 20:31:55
【问题描述】:
我有一个修改我的配置文件的 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 正在工作,但是来自不同的包,而不是主包,但是当我尝试从主包中放置锁时会抛出相同的错误。请帮助我找出我在这里做错了什么。
【问题讨论】:
-
您在检查错误之前调用了 defer。如果有错误,文件将为 nil。
-
@JimB,如果我错了,请纠正我,但是 defer 是堆叠的,只有在函数即将完成时才会执行,对吗?会不会造成问题?
-
没关系。如果你的函数结束并且
lockProgram为零,你会感到恐慌。如果您想推迟关闭,您需要检查错误并提前返回 -
谢谢@JimB,这有帮助。
-
当你的程序崩溃时,你会得到堆栈跟踪。请告诉确切发生恐慌的地方。它在您的 CheckForError 函数中吗?
标签: file go flock filelock panic