уже делает (другую) копию, так что самое большее вы можете изменить только копию копии. Смотрите отредактированный ответ.

ли изменить тип указателя и значение переменной, определенной интерфейсом?

Я могу изменить значение указателя с помощью отражения:v.Elem().Set(reflect.ValueOf(&Greeter{"Jack"}).Elem()) что эквивалентноa = &Greeter{"Jack"}.

Но как я могу сделать отражение эквивалентным дляa = &Greeter2{"Jack"}?

ОБНОВЛЕНИЕ: К сожалению в реальной проблеме, которую я пытаюсь решить, я не могу обратиться к исходной переменной (panic: reflect: reflect.Value.Set using unaddressable value), поэтому я пытаюсь обойти на уровне указателя.

Вот полный пример кода:

package main

import (
    "fmt"
    "reflect"
)

type Greeter struct {
    Name string
}

func (g *Greeter) String() string {
    return "Hello, My name is " + g.Name
}

type Greeter2 struct {
    Name string
}

func (g *Greeter2) String() string {
    return "Hello, My name is " + g.Name
}

func main() {
    var a fmt.Stringer
    a = &Greeter{"John"}

    v := reflect.ValueOf(a)
    v.Elem().Set(reflect.ValueOf(&Greeter{"Jack"}).Elem())
    //v.Elem().Set(reflect.ValueOf(&Greeter2{"Jack"}).Elem()) // panic: reflect.Set: value of type main.Greeter2 is not assignable to type main.Greeter
    fmt.Println(a.String()) // Hello, My name is Jack

    a = &Greeter2{"Ron"}
    fmt.Println(a.String()) // Hello, My name is Ron
}

Ответы на вопрос(1)

Ваш ответ на вопрос