2016-10-19 19 views
-1

誰かがこのgo codeを私に説明できますか?
これが呼び出されると、err != nilは真を返し、したがってポインタの参照がnilになります。私はこれは私がインターフェイスにキャストはnil-構造体ポインタを扱っていたという事実とは何かを持っていることを理解しているインターフェイスでのnilテストに失敗する

type E struct{} 

func (e E) Error() string { 
    return "" 
} 

func DoStuff() *E { 
    return nil 
} 

func main() { 
    var err *E 
    err = DoStuff() 
    log.Println(err) // nil 
    testErr(err) 
} 

func testErr(err error) { 
    if err != nil { 
     log.Println("got error", err.Error()) 
    } 
} 

https://play.golang.org/p/iys7U_UMhG

...

は、しかし、私は混乱していますこのインターフェイスをどのように設計するか、普通の errorだけでなく、 "スマート"エラーオブジェクトを返そうとする場合。

答えて

0

あなたは正しい軌道に乗っていました。あなたは構造体へのポインタを返すことになり、Errorメソッドは非ポインタ呼び出し側で実装されます。 、それはまだエコーこれはクラッシュしませんが

package main 

import "log" 

type E struct{} 

func (e *E) Error() string { 
    return "" 
} 

func DoStuff() *E { 
    return nil 
} 

func main() { 
    var err *E 
    err = DoStuff() 
    log.Println(err) // nil 
    testErr(err) 
} 

func testErr(err error) { 
    if err != nil { 
     log.Println("got error", err.Error()) 
    } 
} 
+0

「エラーが発生しました」 - 渡されたエラー値が実際にnilであるにもかかわらず:

動作するはずです後(私だけError方法の受信機のための*を追加しましたか? – cfstras

関連する問題