interfaceを具象の構造体に型変換できない
以下のようにModel
インターフェイスとTag
構造体があります。Tag
構造体はModel
インターフェイスを実装しています。
[Modelインターフェイス]
type Model interface {
Serialize() []string
}
[Tag構造体]
type Tag struct {
Id int `db:"id"`
Name string `db:"Name"`
}
func (tag Tag) Serialize() []string {
...
}
そして、以下のようなGetModel
関数があり、model_type
にtag
を渡すと、Tag
型のデータが返却されます。この時、GetModel
の戻り値の型はModel
インターフェイスを指定していますが、Tag
構造体はModel
インターフェイスを実装しているためちゃんと動きます。
// func GetModel(model_type string) Tag {
func GetModel(model_type string) Model {
if model_type == "tag" {
return Tag{}
} else if model_type == "xxx" {
return Xxx{}
} else {
return Yyy{}
}
return nil
}
}
しかしながら、以下に示すような、Tag
構造体のId
メンバへのアクセスができません。
model := GetModel(model_type)
fmt.Println(model.Id)
変数model
の型はreflect.TypeOf()
で確認しましたが、Tag
であることは確認できましたが、model.Id
にアクセスすると、Model
インターフェイスにはIdというメンバも関数もないという旨のエラーメッセージが出てきます。model.(Tag)
のようにキャストさせてみたのですが、これも同じ結果でした。
どのようにすれば想定通りに動かすことができるのか、ぜひアドバイスをいただきたく思います。何卒よろしくお願いします。