Задать вопрос
@r1000ru
Программирую

Как создать ссылку на метод из массива-свойства структуры в Go?

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

Язык для меня новый, нагуглить не смог совсем.

Для примера, тоже самое, но на JavaScript
class Test {
    constructor() {
        this._a = 0;
        this._b = 0;
        // Список указателей на методы
        this._fn = new Map();
        this._fn.set(0x00, this._add);
        this._fn.set(0x01, this._sub);
    }

    init(a, b) {
        this._a = a;
        this._b = b;
    }

    _add() {
        return this._a + this._b;
    }

    _sub() {
        return this._a - this._b;
    }

    call(fnID) {
        const fn = this._fn.get(fnID);
        if (!fn) {
            throw new Error('Bad function ID');
        }
        return fn.apply(this);
    }
}

const t = new Test();
t.init(2, 5)
console.log(t.call(0x00), t.call(0x01));

// Результат выполнения: 7 -3
  • Вопрос задан
  • 187 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
@r1000ru Автор вопроса
Программирую
Ниже тоже самое на Go, но без карты методов, а хотелось бы как-то красивее:
package main

import "fmt"

// Test structure
type Test struct {
	a       int8
	b       int8
	opcodes [2]func() int8
}

func (t *Test) add() int8 {
	return t.a + t.b
}

func (t *Test) sub() int8 {
	return t.a - t.b
}

// Init properties
func (t *Test) Init(a, b int8) {
	t.a = a
	t.b = b
	// Вручную заполняем указатели на методы
	t.opcodes[0] = t.add
	t.opcodes[1] = t.sub
	return
}

// Call method by ID
func (t *Test) Call(fnID int8) int8 {
	fn := t.opcodes[fnID]
	if fn == nil {
		panic(`Empty command`)
	}
	r := fn()
	return r
}

func main() {
	t := new(Test)
	t.Init(2, 5)
	fmt.Println(t.Call(0x00), t.Call(0x01))
}

UPD: Убрал switch, добавил массив. Соотвественно вопрос: можно ли сделать так, чтобы при создании экземпляра, автоматом заполнялся массив Test.opcodes указателями на методы
Ответ написан
Не пытайтесь тащить стиль скриптовых языков в го. Здесь другой стиль и другой подход.
Лучше просто писать на джаваскрипте, чем пытаться сделать из го джаваскрипт.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы