GoLang での Nil インターフェースからポインターへの変換エラー
GoLang で、次のように nil インターフェースを特定の型のポインターに変換しようとしました。以下に示すように、エラーがトリガーされます:
type Nexter interface { Next() Nexter } type Node struct { next Nexter } func (n *Node) Next() Nexter {...} func main() { var p Nexter var n *Node fmt.Println(n == nil) // true n = p.(*Node) // error }
このエラーは、次の理由で発生します。インターフェースタイプ (Nexter など) の静的タイプの変数は、nil を含むさまざまな動的タイプの値を保持できます。 (*Node)(nil) を使用して nil 値をポインターに変換することは可能ですが、次の理由から、例で使用されている型アサーションは適用できません。
x.(T)
では x が 非であることが必要です。 nil および型 T。この場合、p にはさまざまな型または nil の値が含まれる可能性があります。
代わりに、明示的なチェックが行われます。
if p != nil { n = p.(*Node) // succeeds if p contains a *Node value }
代わりに、「comma-ok」形式がより安全なオプションを提供します:
if n, ok := p.(*Node); ok { fmt.Printf("n=%#v\n", n) }
「comma-ok」形式を使用すると、nil と nil の両方を処理できます。パニックを引き起こすことなく、非 nil インターフェイス値を生成します。
以上がGo で Nil インターフェイスをポインタに安全に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。