Подтвердить что ты не робот

преобразовать указатель структуры в интерфейс {}

Если у меня есть:

   type foo struct{
   }

   func bar(baz interface{}) {
   }

Вышеизложенные камни - я не могу изменить foo или bar. Кроме того, baz необходимо преобразовать обратно в указатель foo struct внутри бара. Как я могу использовать & foo {} для интерфейса {}, поэтому я могу использовать его в качестве параметра при вызове bar?

4b9b3361

Ответ 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()
}