web-dev-qa-db-ja.com

構造体ポインタをインターフェイスに変換する{}

私が持っている場合:

   type foo struct{
   }

   func bar(baz interface{}) {
   }

上記は石に設定されています-fooまたはbarを変更することはできません。さらに、bazはbar内でfoo構造体ポインターに変換し直す必要があります。 &foo {}をinterface {}にキャストして、barを呼び出すときにパラメーターとして使用するにはどうすればよいですか?

20
lf215

*foointerface{}に変えるのは簡単です:

f := &foo{}
bar(f) // every type implements interface{}. Nothing special required

*fooに戻るには、type assertionのいずれかを実行できます。

func bar(baz interface{}) {
    f, ok := baz.(*foo)
    if !ok {
        // baz was not of type *foo. The assertion failed
    }

    // f is of type *foo
}

または、type switch(同様ですが、bazが複数のタイプである場合に便利です):

func bar(baz interface{}) {
    switch f := baz.(type) {
    case *foo: // f is of type *foo
    default: // f is some other type
    }
}
47
ANisus

リフレクトを使用する

reflect.ValueOf(myStruct).Interface().(newType)
4
archever

完全に関連しているわけではありませんが、「インターフェイス構造体をポインターに変換する」という質問をグーグルで検索して、ここに行きました。

だから、メモしてください:interface of Tからinterface of *T

//
// Return a pointer to the supplied struct via interface{}
//
func to_struct_ptr(obj interface{}) interface{} {
    vp := reflect.New(reflect.TypeOf(obj))
    vp.Elem().Set(reflect.ValueOf(obj))
    return vp.Interface()
}
0
shawn