преобразовать указатель структуры в интерфейс {}
Если у меня есть:
type foo struct{
}
func bar(baz interface{}) {
}
Вышеизложенные камни - я не могу изменить foo или bar. Кроме того, baz необходимо преобразовать обратно в указатель foo struct внутри бара. Как я могу использовать & foo {} для интерфейса {}, поэтому я могу использовать его в качестве параметра при вызове bar?
Ответы
Ответ 1
Чтобы превратить *foo
в interface{}
тривиально:
f := &foo{}
bar(f) // every type implements interface{}. Nothing special required
Чтобы вернуться к *foo
, вы можете либо выполнить утверждение типа:
func bar(baz interface{}) {
f, ok := baz.(*foo)
if !ok {
// baz was not of type *foo. The assertion failed
}
// f is of type *foo
}
Или параметр (похоже, но полезно, если baz
может быть нескольких типов):
func bar(baz interface{}) {
switch f := baz.(type) {
case *foo: // f is of type *foo
default: // f is some other type
}
}
Ответ 2
использовать отражать
reflect.ValueOf(myStruct).Interface().(newType)
Ответ 3
Не полностью связано, но я погуглил вопрос "преобразовать структуру интерфейса в указатель" и получил здесь.
Итак, просто запомните: для преобразования 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()
}