@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
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 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 указателями на методы
Ответ написан
Не пытайтесь тащить стиль скриптовых языков в го. Здесь другой стиль и другой подход.
Лучше просто писать на джаваскрипте, чем пытаться сделать из го джаваскрипт.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Gadsbee Казань
от 80 000 до 150 000 ₽
Payture Москва
До 150 000 ₽
Яндекс Москва
от 100 000 до 300 000 ₽
06 июл. 2020, в 23:49
10000 руб./за проект
06 июл. 2020, в 23:32
35000 руб./за проект