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

    @r1000ru Автор вопроса
    Александр Павлюк, Да, точно спасибо. Вечно забываю что в Go всегда копирование...
  • Как создать ссылку на метод из массива-свойства структуры в Go?

    @r1000ru Автор вопроса
    Александр Павлюк, я не вполне уверен что это верно для Go, но в js это будет создавать массивы с функциями для каждого экземпляра структуры (объекта в жс) , а в моем варианте - массив со ссылками на функции, которые скомпилированы в единичном экземпляре.
  • Как создать ссылку на метод из массива-свойства структуры в Go?

    @r1000ru Автор вопроса
    После сегодняшних прочтений, уверен что карта (map) - не нужна. Мне не требуется динамически добавлять и удалять методы. Они заранее определены. По этому массив (слайс на него как указатель) - максимально быстрое решение. .a и .b - это просто пример, чтобы показать, что методы, работают со свойствами.

    Вот оригинальный пакет с незаполненными методами стековой машины:
    package vm
    
    import "fmt"
    
    const memSizeFlash = 255
    const memSizeRAM = 64
    const memSizeStack = 64
    
    // VMachine - vurtual machine structure
    type VMachine struct {
    	flash   [memSizeFlash]uint8 // ROM array
    	ram     [memSizeRAM]uint8   // RAM array
    	stack   [memSizeStack]int32 // Stack array
    	PC      uint16              // Programm counter
    	SC      uint16              // Stack counter
    	IR      uint16              // Interrupt address
    	opcodes [128]func() bool    // Pointers on methods
    }
    
    func (v *VMachine) tick() bool {
    	funcID := v.flash[v.PC]
    
    	next := v.opcodes[funcID]()
    	fmt.Println(funcID, next, v.PC)
    	v.PC++
    	return next
    }
    
    func (v *VMachine) init() {
    	v.opcodes[0x00] = v.oFin
    	v.opcodes[0x01] = v.oNoop
    }
    
    // Load new bytecode to flash and reset registers
    func (v *VMachine) Load(opcodes []uint8) {
    	v.init()
    	flash := v.flash[:]
    	copy(flash, opcodes)
    	v.PC = 0x0000
    	v.IR = memSizeFlash - 1
    	return
    }
    
    // Interrupt ticks and call interrupt function
    func (v *VMachine) Interrupt() {
    	return
    }
    
    // Run algorithm
    func (v *VMachine) Run() {
    	for {
    		next := v.tick()
    		if !next {
    			break
    		}
    	}
    
    	fmt.Println(v.flash)
    	return
    }
    
    func (v *VMachine) oFin() bool {
    	return false
    }
    
    func (v *VMachine) oNoop() bool {
    	return true
    }


    При создании нового экземпляра, в обязательном порядке используется Load(для передачи слайса на массив байт-кода). Там же я вызываю .init для установки указателей на методы. Хотелось бы сделать это автоматически при new(VMachine)
  • Как создать ссылку на метод из массива-свойства структуры в Go?

    @r1000ru Автор вопроса
    В оригинале структура состоит из массива opcodes, содержащий байткод простенькой стековой машины. Код генерируется пользователем по своему усмотрению, но с учетом ограничений инструкций стековой машины. При наступлении определенных событий (входящие данные), если эти данные для этого экземпляра структуры, дергается метод Run, который пробегает по байтам и в зависимости от того, какое значение там записано, дергает нужный метод и использует входящие параметры. Мапа тут не причем, функции вполне себе определены изначально и могут быть помещены в массив. От стековой машины отказаться нельзя, это обязательное условие. Сделать статические функции, которым передавался бы нужная структура для обработки - можно. А это правда нужно, учитывая необходимость параллельной обработки? В ноде я хоть миллион однотипных объектов создам, методы будут существовать только в единственном экземпляре, а вот ссылки на их области видимости внутри объекта - уникальные, каждая на себя . Предполагаю что и в Go методы работают так же.
  • Как создать ссылку на метод из массива-свойства структуры в Go?

    @r1000ru Автор вопроса
    На ноде с использование WorkerThreads 40000 подобных объектов с 65 подобными методами выжирают довольно много ресурсов. А Go мне интересен и интересно как он будет их потреблять. И я не стремлюсь тащить что-то куда-то. Но и ответ на вопрос найти не получилось. Впрочем так как конструкторов Go не имеет, видимо единственно возможный способ гарантированно заполнить массив ссылками, это сделать обязательный к вызову метод. Или вызывать его самому, сделав доступным вне пакета где описывается структура, одну функцию, которая вернёт инициализированную структуру (выполнив перед эти этот метод)
    func Create(a, b int8) *Test {
      t := new(Test) 
      t.Init(a, b) 
      return t
    }