Dinamicamente chamar o método na interface {}, independentemente do tipo de receptor

Eu estou trabalhando em um sistema de templates escrito em Go, o que significa que requer o uso liberal doreflect pacote. Nesta circunstância específica, eu preciso ser capaz de chamar dinamicamente um método em uminterface{}. A estranheza é que minha lógica de reflexão funciona bem desde que meus dados sejam de um tipo conhecido, mas não se os dados forem do tipointerface{}.

O exemplo a seguir você pode ver que a lógica emmain() ePass() é idêntico. A única diferença é se os dados são um tipo conhecido ou um tipo conhecido dentro de uminterface{}

Vá jogar:http://play.golang.org/p/FTP3wgc0sZ

package main

import (
    "fmt"
    "reflect"
)

type Test struct {
    Start string
}

func (t *Test) Finish() string {
    return t.Start + "finish"
}

func Pass(i interface{}) {
    _, ok := reflect.TypeOf(&i).MethodByName("Finish")
    if ok {
        fmt.Println(reflect.ValueOf(&i).MethodByName("Finish").Call([]reflect.Value{})[0])
    } else {
        fmt.Println("Pass() fail")
    }
}

func main() {
    i := Test{Start: "start"}

    Pass(i)
    _, ok := reflect.TypeOf(&i).MethodByName("Finish")
    if ok {
        fmt.Println(reflect.ValueOf(&i).MethodByName("Finish").Call([]reflect.Value{})[0])
    } else {
        fmt.Println("main() fail")
    }
}

Ao executar este código, obtemos o seguinte resultado

Pass() fail
startfinish

O que significa que minha metodologia para chamar dinamicamente um método funciona bem, exceto em um cenário em que meu objeto está atualmente em uminterface{}.

Se em vez disso eu não usar um receptor de ponteiro e passari então funciona como esperado.

Vá jogar:http://play.golang.org/p/myM0UXVYzX

Isso me leva a acreditar que o meu problema é que não consigo acessar o endereço de i (&i) quando é uminterface{}. Eu vasculhei o pacote reflect e testei coisas comoreflect.Value.Addr() ereflect.PtrTo() mas eu não conseguia trabalhar da maneira que precisava. Meu palpite é que isso tem algo a ver com o fato de queinterface{} é, por definição, um objeto de referência.

questionAnswers(3)

yourAnswerToTheQuestion