yn2011's blog

技術メモ

型アサーションでインターフェイス型から本来の型を取り出す際の演算子*

環境

インターフェイス型の型アサーション

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のポインタ型という意味なのだろうか...? (そうかもしれない)

もしくはこの場合の演算子*は既存の規則とは分けて考えるべきなのだろうか。

気になる。