如何通过并行传递指针的参考?

时间:2018-12-22 19:10:03

标签: pointers go parallel-processing

我正在编写一个机器人以并行运行一些命令,同时并行运行这些机器人,但是我在启动和暂停功能方面遇到困难。

下面,我将留下一个示例设置。预计其中一个机器人将继续运行,而其他机器人将停止运行,但所有机器人最终都将运行。

有人可以向我解释为什么在使用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 :(得分:1)

range语句返回机器人的值,然后将其更改,因此您实际上是在检查其他机器人。.使用引用-

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

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