假设我尝试获取锁,失败并想退出程序。
err = syscall.Flock(lockfd, syscall.LOCK_EX|syscall.LOCK_NB)
if err == syscall.EAGAIN {
os.Exit(err)
}
问题是你需要将一个整数传递给 os。退出。
我试过:
os.Exit(int(err))
os.Exit(syscall.EAGAIN)
// Compiles fine, but the cast fails.. no idea why
eerr, _ := err.(*syscall.Errno); os.Exit(int(*eerr))
// panics
reflect.ValueOf(err).Int()
似乎您可以比较系统调用。错误到其他整数,但实际上试图获取它的值正在逃避我......
通常只需将syscall.Errno
转换为 int
if err == syscall.EAGAIN {
os.Exit(int(err))
}
syscall.Errno
被定义为一个uintptr
,可以直接转换为int
。不涉及接口、断言或反射。
但是,当将其作为error
接口接收时,您需要先断言它。
if err == syscall.EAGAIN {
os.Exit(int(err.(syscall.Errno)))
}
syscall.Errno
用作值,而不是指针,无需尝试用 *
取消引用它。
不要使用 errno
值作为退出代码。
退出值和errno
值可能都是整数,但它们在其他方面没有任何共同点。
特别是,EPERM
经常(总是?"1",但 shell 经常处理/期望 1 的退出代码是"替代成功"而不是失败(例如,当grep
找不到匹配项时)。
再举个例子,系统出口(3)手册页对于 BSD,定义一些用于exit
的值。
但是,Go(与操作系统无关)不使用这些。例如,标志包以 "2" 而不是 BSD 推荐的 "64" (EX_USAGE
) 退出。(注意,在 BSD 64 上,errno 值是 EHOSTDOWN
)。