Entrega de comida com Golang Magics

Mar 06 2023
.

func main() {
    orders := make(chan Order)
    drivers := make(chan Driver)

    // start a Goroutine to handle incoming orders
    go func() {
        for {
            order := receiveOrder()
            orders <- order
        }
    }()

    // start a Goroutine for each driver
    for i := 0; i < numDrivers; i++ {
        go func() {
            for {
                driver := receiveDriver()
                drivers <- driver

                // handle the next available order
                order := <-orders
                assignOrder(order, driver)
            }
        }()
    }
}

type Order struct {
    // order details
}

type Driver struct {
    // driver details
}

func receiveOrder() Order {
    // receive an order from an external system
}

func receiveDriver() Driver {
    // receive a driver from an external system
}

func assignOrder(order Order, driver Driver) {
    // assign the order to the driver
}

func main() {
    orders := make(chan Order)
    drivers := make(chan Driver)

    // start a Goroutine to handle incoming orders
    go func() {
        for {
            order := receiveOrder()
            orders <- order
        }
    }()

    // start a Goroutine for each driver
    for i := 0; i < numDrivers; i++ {
        go func() {
            for {
                driver := receiveDriver()
                drivers <- driver

                // handle the next available order
                order := <-orders
                assignOrder(order, driver)
            }
        }()
    }
}

type Driver struct {
    // driver details
    mu sync.Mutex
    busy bool
}

func assignOrder(order Order, driver Driver) {
    driver.mu.Lock()
    driver.busy = true
    driver.mu.Unlock()

    // handle the order

    driver.mu.Lock()
    driver.busy = false
    driver.mu.Unlock()
}