2017-11-30 4 views
-2

を使用するには、以下:どのように私のようなソースを持って、エラー・インタフェース

type Record struct { 
    Message string `json:"message"` 
    Service string `json:"service"` 
    Success bool `json:"success"` 
    Error string `json:"error"` 
} 

func (zp *Zephyr) Write(err ...*error) { 

    if len(err) > 0 { 
     errPtr := err[0] 
     if errPtr != nil && *errPtr != nil { 
      // error occurred, set success to false and Error to the error message 
      zp.Success = false 
      zp.Error = errPtr 
     } else { 
      zp.Success = true 
     } 
    } 
} 

私は理解していないで、私はerrPtrに埋め込まれた文字列にアクセスすることができますか?

+0

[ポインタとパラメータと戻り値の値の対比]の可能な複製(https://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values) –

+0

ありがとう下降票については、あなたの洞察力のあるコメントが最も役立っています。 – specialk

答えて

2

最初に、*errorがほしいと思わない場合は、ほんのちょうどerrorが必要です。インタフェースへのポインタはまれにしか正しい選択ではありません。

第2に、stringが必ずしもerrorに埋め込まれている必要はありません。 definition of errorは、より多くの何物でもありません:あなたはError()メソッドを呼び出した場合、それは文字列を返しますが、それはメソッドが呼び出されるたびに生成することができる意味

type error interface { 
     Error() string 
} 

。必ずしもエラーオブジェクトの文字列フィールドではありません。ここ

zp.Error = (*errPtr).Error() 

遊び場例:あなたが署名を変更できない場合

func (zp *Zephyr) Write(err ...error) { 

    if len(err) > 0 { 
     errPtr := err[0] 
     if errPtr != nil { 
      // error occurred, set success to false and Error to the error message 
      zp.Success = false 
      zp.Error = errPtr.Error() 
     } else { 
      zp.Success = true 
     } 
    } 
} 

は、あなただけのポインタを間接参照する必要があります:あなたが欲しいものを

ほとんどの場合には、このようなものです: https://play.golang.org/p/dxT108660l

エラーはthe Go tourでもカバーされます。

+0

申し訳ありませんが、私は明確ではありませんでした - 上記のコードは私が処理しなければならないものです - エラーからエラーに変更することはできません。私はすでにerrPtr.Error()を試していて、それは動作しません(未解決の参照 'Error') – specialk

+0

最新の編集を見てください。 – Adrian

+0

それは答えです(ポインタ逆参照) - ありがとう! – specialk

関連する問題