亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

你如何將 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 關注
  • 253 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號