Конечный автомат в Go - PullRequest
       2

Конечный автомат в Go

0 голосов
/ 20 апреля 2020

У меня есть некий конечный автомат. Итак, у меня есть состояния:

const (
    state1 = iota
    state2
    state3
    exit
)

Кроме того, у меня есть chan:

stateMachine := make(chan int)

Я поставил первое состояние:

stateMachine <- state1

И затем, Я ввожу в бесконечное l oop вот так:

for {
   select {
   case state := <- stateMachine:
      switch state {
      case state1: 
         fmt.Println("state1")
         stateMachine <- state2
      case state2: 
         fmt.Println("state2")
         stateMachine <- state3
      case state3: 
         fmt.Println("state3")
         stateMachine <- exit
      case exit:
         fmt.Println("Exit")
         os.Exit(0)
      }
   }
}

Но это не работает.

https://play.golang.org/p/s5uYJy-fMKe

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Канал - это механизм синхронизации. Запись или чтение в небуферизованный канал будет успешной, только если есть другая процедура, ожидающая чтения / записи из того же канала. Так как у вас есть небуферизованный канал и вы пытаетесь использовать канал в качестве хранилища состояний, ваша первая запись блокируется, потому что нет других считываний с него.

Попробуйте использовать канал с емкостью 1:

stateMachine := make(chan int,1)

Это позволит записи работать, пока на канале есть память.

0 голосов
/ 20 апреля 2020

Не знаю почему, но это работает:

package main

import (
    "fmt"
    "os"
)

const (
    state1 = iota
    state2
    state3
    exit
)

func main() {
    stateMachine := make(chan int)
    go func() { stateMachine <- state1 }()
    for {
        select {
        case state := <-stateMachine:
            switch state {
            case state1:
                fmt.Println("state1")
                go func() { stateMachine <- state2 }()
            case state2:
                fmt.Println("state2")
                go func() { stateMachine <- state3 }()
            case state3:
                fmt.Println("state3")
                go func() { stateMachine <- exit }()
            case exit:
                fmt.Println("Exit")
                os.Exit(0)
            }
        }
    }
}

https://play.golang.org/p/JH-w6SDCh-Z

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