Задать вопрос
@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
  • Вопрос задан
  • 204 просмотра
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Go-разработчик с нуля + нейросети
    9 месяцев
    Далее
  • Яндекс Практикум
    Go-разработчик с нуля
    8 месяцев
    Далее
  • Хекслет
    GO-разработчик
    6 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 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 указателями на методы
Ответ написан
Не пытайтесь тащить стиль скриптовых языков в го. Здесь другой стиль и другой подход.
Лучше просто писать на джаваскрипте, чем пытаться сделать из го джаваскрипт.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Воронеж
от 75 000 до 120 000 ₽
ITK academy Нижний Новгород
от 75 000 до 120 000 ₽