以下のように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_typetagを渡すと、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)のようにキャストさせてみたのですが、これも同じ結果でした。

どのようにすれば想定通りに動かすことができるのか、ぜひアドバイスをいただきたく思います。何卒よろしくお願いします。