Nil エラー インスタンスが Nil として表示されない
インターフェイスの比較を理解するには、型と値の両方が評価されることを認識することが重要です。
コード スニペットを考えてみましょう:
type Goof struct {}
func (goof *Goof) Error() string {
return fmt.Sprintf("I'm a goof")
}
func TestError(err error) {
if err == nil {
fmt.Println("Error is nil")
} else {
fmt.Println("Error is not nil")
}
}
func main() {
var g *Goof // nil
TestError(g) // expect "Error is nil"
}
ここでは、 g が nil であるため、「エラーが nil ではない」ことが期待されます。ただし、インターフェイスの比較により、「エラーは nil」になります。これは、(*Goof)(nil) の型が error(nil) とは異なるためです。
これを解決するには、var g *Goof の代わりに var err error を宣言できます。あるいは、関数がエラーを返した場合は、単純に nil を返します。
さらに明確にするために、インターフェイスの比較では、型がインターフェイスを実装しているかどうかではなく、型が同一であるかどうかをチェックします。そのため、次の例は、基になるデータが同じである非 nil インターフェースであっても、型の違いにより不等であると比較される可能性があることを示しています:
package main
import "fmt"
type Bob int
func main() {
var x int = 3
var y Bob = 3
var ix, iy interface{} = x, y
fmt.Println(ix == iy)
}
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3