как передать ссылку указателя с параллелизмом? - PullRequest
0 голосов
/ 22 декабря 2018

Я пишу бота для параллельного запуска некоторых команд и одновременного запуска ботов, но у меня возникают проблемы с запуском и приостановкой функций.

Ниже я оставлю примерЯ настроил.Ожидалось, что один из ботов продолжит работать, а другие остановятся, но все в конечном итоге будут запущены.

Может кто-нибудь объяснить мне, почему при использовании команды startbot() он не получает bool?

package main

import (
    "log"
    "time"
)

type botBase struct {
    isEnabled bool
}

func (b *botBase) startFunctionX() {
    b.isEnabled = true
}

func (b *botBase) pauseFunctionX() {
    b.isEnabled = false
}

func (b botBase) runCommandX() {
    for {
        if b.isEnabled {
            log.Print("running...")
        } else {
            log.Print("paused...")
        }
        time.Sleep(1 * time.Second)
    }
}

type bot struct {
    botBase
    //other stuffs
}

func (b bot) runAllCommands() {
    go b.runCommandX()

    //wait parallels commands
    for{
        time.Sleep(10 * time.Hour)
    }
}

type bots struct {
    List []bot
}

func (b *bots) loadListDB() {
    b1 := bot{}
    b1.isEnabled = false
    b2 := bot{}
    b2.isEnabled = false
    b.List = []bot{b1, b2}
}

var myBots bots

func main() {
    myBots.loadListDB()
    for _, b := range myBots.List {
        b.startFunctionX()
        go b.runAllCommands()
    }

    //control stop and start bots
    log.Print("expected true = ", myBots.List[0].isEnabled)
    myBots.List[0].pauseFunctionX()
    log.Print("expected false = ", myBots.List[0].isEnabled)


    //wait bots parallels
    for {
        time.Sleep(10 * time.Hour)
    }
}

1 Ответ

0 голосов
/ 22 декабря 2018

оператор range возвращает значение бота, которое затем изменяется, поэтому вы на самом деле проверяете другого бота .. работаете со ссылками -

for i := range myBots.List {
    b := &myBots.List[i]
    b.startFunctionX()
    go b.runAllCommands()
}

https://play.golang.org/p/1V8tKx431QJ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...