Go で Null インターフェイスをポインターに変換する
Go では、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) // prints true n = p.(*Node) // fails }
静的インターフェイス (Nexter) は nil を含むさまざまな動的タイプの値を保持できるため、これは失敗します。型アサーション (p.(*Node)) は nil インターフェイス値に対して実行できません。
ただし、nil 値を特定の型のポインターに直接割り当てることは可能です:
n = (*Node)(nil)
これは、動的タイプ *Node の nil 値を n に割り当てます。
nil インターフェース値を処理するには、それらをチェックします。明示的に:
if p != nil { n = p.(*Node) // only succeeds if p contains a value of type *Node }
または、「comma-ok」形式を使用します:
if n, ok := p.(*Node); ok { // n is not nil and holds a value of type *Node }
「comma-ok」形式を使用すると、アサーションが決して失敗せず、次のことを示すブール値が返されます。パニックを引き起こすのではなく、アサーションが成立するかどうか。これにより、nil インターフェイス値と非 nil インターフェイス値の両方を安全に処理できるようになります。
以上がGo で Nil インターフェイスをポインタに安全に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。