为了账号安全,请及时绑定邮箱和手机立即绑定

你如何将 syscall.Errno 传递给 os.Exit?

你如何将 syscall.Errno 传递给 os.Exit?

Go
饮歌长啸 2021-09-13 10:30:53
假设我尝试获取锁,失败,并想退出程序。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被用作值,而不是一个指针,没有必要去尝试,并取消对它的引用*。


查看完整回答
反对 回复 2021-09-13
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

不要使用errno值作为退出代码。

退出值和errno值可能都是整数,但除此之外它们没有任何共同点。

特别是,EPERM通常(总是?)“1”,但 shell 经常处理/期望退出代码 1 是“替代成功”而不是失败(例如,当grep没有找到匹配项时)。

另一个示例, BSD的sysexits(3) 联机帮助页定义了一些用于exit.

然而,Go(更多的操作系统不可知)不使用这些。例如,标志包以“2”而不是EX_USAGEBSD 推荐的“64”()退出。(注意,在 BSD 64 上,errno 值为EHOSTDOWN)。


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信