![](/img/trans.png)
[英]Why does returning a concrete type not satisfy a Interface requiring a Interface return
[英]Why is it recommended to return with the `error` interface in go rather than with the concrete error type?
go FQA狀態:
對於返回錯誤的函數,最好在其簽名中始終使用錯誤類型(正如我們上面所做的那樣),而不是像 *MyError 這樣的具體類型,以幫助確保正確創建錯誤。 例如, os.Open返回一個錯誤,即使不是 nil,它也總是具體類型*os.PathError 。
但是這篇文章聲稱有時返回一個具體的類型是可以的:
(由於 Go 常見問題解答中討論的原因,將錯誤的具體類型而不是錯誤傳回通常是錯誤的,但在這里這樣做是正確的,因為
ServeHTTP
是唯一可以看到該值並使用其內容的地方。)
我的問題是,返回error
而不是具體類型有什么好處,它如何幫助保證正確創建錯誤,以及為什么在不同地方不使用錯誤時返回具體類型是可以的?
這與作為接口的error
有關。 一個接口包含一個指向它所包含的值的指針以及該值的類型。 只有當這兩個值都為 nil 時,接口才為 nil。 因此,如果您從 function 返回一個具體的錯誤類型,然后返回一個error
,則該錯誤不會為零。
type MyError string
func (e MyError) Error() string {return string(e)}
func f() *MyError {
return nil
}
func g() error {
return f()
}
func main() {
x:=g()
if x==nil {
fmt.Println("nil")
}
}
在上面的示例中,即使*MyError
的值為 nil,但g()
的返回值卻不是,因為它包含一個類型為*MyError
且值為 nil 的接口。
這是所有返回接口值的函數的問題,並且最常見於error
類型。 所以不要聲明返回具體錯誤值的函數,除非這些函數的用途非常有限,例如未導出的函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.