50343


以下のように`Model`インターフェイスと`Tag`構造体があります。`Tag`構造体は`Model`インターフェイスを実装しています。

[Modelインターフェイス]

[code]

    type Model interface {
      Serialize() []string   
    }
    
[/code]

[Tag構造体]

[code]

    type Tag struct {
      Id   int    `db:"id"`
      Name string `db:"Name"`
    }
    func (tag Tag) Serialize() []string {
      ...
    }
    
[/code]

そして、以下のような`GetModel`関数があり、`model_type`に`tag`を渡すと、`Tag`型のデータが返却されます。この時、`GetModel`の戻り値の型は`Model`インターフェイスを指定していますが、`Tag`構造体は`Model`インターフェイスを実装しているためちゃんと動きます。

[code]

    // 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
      }
    }
    
[/code]

しかしながら、以下に示すような、`Tag`構造体の`Id`メンバへのアクセスができません。

[code]

    model := GetModel(model_type)
    fmt.Println(model.Id)
    
[/code]

変数`model`の型は`reflect.TypeOf()`で確認しましたが、`Tag`であることは確認できましたが、`model.Id`にアクセスすると、`Model`インターフェイスにはIdというメンバも関数もないという旨のエラーメッセージが出てきます。`model.(Tag)`のようにキャストさせてみたのですが、これも同じ結果でした。

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


CC BY-SA 4.0
2018-11-10T02:27:34.907
50151
2018-11-15T03:02:52.843
28291
question
go
interfaceを具象の構造体に型変換できない


コメント欄にもある通り、以下で対応できました。

[code]

    model := GetModel(model_type).(Tag)
    
[/code]

また、interfaceのような抽象的な型を構造体のような具象的な型として利用するときは、逐一、型アサーションや型スイッチ構文を利用する必要があるみたいです。


CC BY-SA 4.0
2018-11-15T03:02:52.843
50343
2018-11-15T03:02:52.843
28291
50151
answer