Golang: изменение реализации метода в run-time

Рейтинг: 0Ответов: 1Опубликовано: 18.02.2015

У меня есть реализация типа:

type A struct{
  name string
}

func (a A) getName() string {
  return "My name is " + a.name 
}

Как изменить реализацию метода getName во время выполнения?

Обновление

Переопределение таким образом, чтобы до переопределения "a.getName()" вызывало описанную реализацию, а после переопределения - новую.

Ответы

▲ 3Принят

Фукнция это превоклассное значение в Go. Можно сделать это имя полем, и присваивать ему значение:

package main

type Typ struct {
    foo func ()
}

func main() {
    t := Typ{}
    t.foo = func () {
        println("first implementation")
    }
    t.foo()
    t.foo = func () {
        println("second implementation")
    }
    t.foo()
}

выдаст:

first implementation
second implementation

UPD: Если хочется именно метод, то можно в методе вызывать изменяемое поле.

package main

type A struct {
}

var globalFoo = func () string {
    return "first"
}

func (a A) getName() string {
    return globalFoo()
}

func main() {
    a := A{}
    println(a.getName())
    globalFoo = func () string {
        return "second"
    }
    println(a.getName())
}

Но тот факт что вам такого хочется -- уже настораживает.