假设我尝试获取锁,失败,并想退出程序。err = syscall.Flock(lockfd, syscall.LOCK_EX|syscall.LOCK_NB)if err == syscall.EAGAIN { os.Exit(err)}问题是您需要将一个整数传递给 os.Exit。我试过了:os.Exit(int(err))os.Exit(syscall.EAGAIN)// Compiles fine, but the cast fails.. no idea whyeerr, _ := err.(*syscall.Errno); os.Exit(int(*eerr)) // panicsreflect.ValueOf(err).Int()似乎您可以将 syscall.Errno 与其他整数进行比较,但实际上试图获取它的值却让我望而却步......
2 回答
繁华开满天机
TA贡献1816条经验 获得超4个赞
您通常可以将 a 转换syscall.Errno为 int
if err == syscall.EAGAIN {
os.Exit(int(err))
}
syscall.Errno定义为 a uintptr,可以直接转换为int。不涉及接口、断言或反射。
但是当它作为error接口接收时,你需要先断言它。
if err == syscall.EAGAIN {
os.Exit(int(err.(syscall.Errno)))
}
将syscall.Errno被用作值,而不是一个指针,没有必要去尝试,并取消对它的引用*。
缥缈止盈
TA贡献2041条经验 获得超4个赞
不要使用errno
值作为退出代码。
退出值和errno
值可能都是整数,但除此之外它们没有任何共同点。
特别是,EPERM
通常(总是?)“1”,但 shell 经常处理/期望退出代码 1 是“替代成功”而不是失败(例如,当grep
没有找到匹配项时)。
另一个示例, BSD的sysexits(3) 联机帮助页定义了一些用于exit
.
然而,Go(更多的操作系统不可知)不使用这些。例如,标志包以“2”而不是EX_USAGE
BSD 推荐的“64”()退出。(注意,在 BSD 64 上,errno 值为EHOSTDOWN
)。
- 2 回答
- 0 关注
- 227 浏览
添加回答
举报
0/150
提交
取消