2 回答

TA貢獻1829條經驗 獲得超6個贊
我會轉
func doSomething() int, ? {
...
if somethingBadHappened {
return ?, err
}
if somethingElseBadHappened {
return ?, err2
}
return x, nil
}
進入
func doSomething() (r int, err error) {
...
if somethingBadHappened {
err = err1 // Whatever satisfies the `error` interface
return
}
if somethingElseBadHappened {
err = err2 // dtto
return
}
return x, nil
}
IOW,在調用站點,如果 err != nil,則忽略、從不使用或依賴任何其他返回值是慣用的*,所以只要不關心r上面是否已分配了一些中間值。
(*) 在第一個近似值中,即如果沒有另外說明。例如,一個io.Reader顯式聲明它可以同時返回err == io.EOF有效數據:
當 Read 在成功讀取 n > 0 個字節后遇到錯誤或文件結束條件時,它返回讀取的字節數。它可能會從同一個調用中返回(非零)錯誤或從后續調用中返回錯誤(和 n == 0)。這種一般情況的一個實例是,在輸入流末尾返回非零字節數的 Reader 可能返回 err == EOF 或 err == nil。不管怎樣,下一個 Read 應該返回 0,EOF。
- 2 回答
- 0 關注
- 250 瀏覽
添加回答
舉報