型アサーションでインターフェイス型から本来の型を取り出す際の演算子*
環境
インターフェイス型の型アサーション
Goでは、以下のようにインターフェイスのエイリアスであるStatement
型の変数から実際の型であるExpressionStatement
を型アサーション.(T)
によって取り出すことができる。
package main import "fmt" type Statement interface { // [...] statementNode() } type ExpressionStatement struct { // [...] hoge string } func (es *ExpressionStatement) statementNode() { // [...] } func getExpressionStatement() Statement { return &ExpressionStatement{hoge: "hoge"} } func main() { exStmt := getExpressionStatement() stmt, ok := exStmt.(*ExpressionStatement) fmt.Println(stmt.hoge) fmt.Println(ok) }
演算子*
の意味
ところで、実際に型アサーションを行っているstmt, ok := exStmt.(*ExpressionStatement)
の*
はどういう意味なのか。
最初は、式の中なのでポインタ型変数の中身を参照(dereference)しているのか、と思ったがExpressionStatement
はポインタ型変数ではない。
型アサーションは型名を引数に取ることを思い出すと、構造体のエイリアス型であるExpressionStatement
のポインタ型という意味なのだろうか...? (そうかもしれない)
もしくはこの場合の演算子*
は既存の規則とは分けて考えるべきなのだろうか。
気になる。