猿问

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

假设我尝试获取锁,失败,并想退出程序。


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 why

eerr, _ := err.(*syscall.Errno); os.Exit(int(*eerr)) 


// panics

reflect.ValueOf(err).Int()

似乎您可以将 syscall.Errno 与其他整数进行比较,但实际上试图获取它的值却让我望而却步......


饮歌长啸
浏览 228回答 2
2回答

繁华开满天机

您通常可以将 a 转换syscall.Errno为 intif 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被用作值,而不是一个指针,没有必要去尝试,并取消对它的引用*。

缥缈止盈

不要使用errno值作为退出代码。退出值和errno值可能都是整数,但除此之外它们没有任何共同点。特别是,EPERM通常(总是?)“1”,但 shell 经常处理/期望退出代码 1 是“替代成功”而不是失败(例如,当grep没有找到匹配项时)。另一个示例, BSD的sysexits(3) 联机帮助页定义了一些用于exit.然而,Go(更多的操作系统不可知)不使用这些。例如,标志包以“2”而不是EX_USAGEBSD 推荐的“64”()退出。(注意,在 BSD 64 上,errno 值为EHOSTDOWN)。
随时随地看视频慕课网APP

相关分类

Go
我要回答