假設我嘗試獲取鎖,失敗,并想退出程序。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 關注
- 253 瀏覽
添加回答
舉報
0/150
提交
取消