私が持っている場合:
type foo struct{
}
func bar(baz interface{}) {
}
上記は石に設定されています-fooまたはbarを変更することはできません。さらに、bazはbar内でfoo構造体ポインターに変換し直す必要があります。 &foo {}をinterface {}にキャストして、barを呼び出すときにパラメーターとして使用するにはどうすればよいですか?
*foo
をinterface{}
に変えるのは簡単です:
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
}
}
リフレクトを使用する
reflect.ValueOf(myStruct).Interface().(newType)
完全に関連しているわけではありませんが、「インターフェイス構造体をポインターに変換する」という質問をグーグルで検索して、ここに行きました。
だから、メモしてください: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()
}