среда, 16 января 2019 г.

Основы Go: оператор select

Оператор select позволяет go-процедуре находиться в ожидании нескольких операций передачи данных.

select блокируется до тех пор, пока один из его блоков case не будет готов к запуску, а затем выполняет этот блок. Если сразу несколько блоков могут быть запущены, то выбирается произвольный.

package main

import "fmt"

func fibonacci(c, quit chan int) {
  x, y := 0, 1
  for {
    select {
    case c <- x:
      x, y = y, x+y
    case <-quit:
      fmt.Println("quit")
      return
    }
  }
}

func main() {
  c := make(chan int)
  quit := make(chan int)
  go func() {
    for i := 0; i < 10; i++ {
      fmt.Println(<-c)
    }
    quit <- 0
  }()
  fibonacci(c, quit)
}

Вывод:

0
1
1
2
3
5
8
13
21
34
quit

Блок default в select

Блок default в select запускается, если никакой другой блок не готов.

Используйте default, чтобы посылать и получать данные без блокировок:

select {
case i := <-c:
    // используйте i
default:
    // получение из c вызвало бы блокировку
}

Пример:

package main

import (
  "fmt"
  "time"
)

func main() {
  tick := time.Tick(100 * time.Millisecond)
  boom := time.After(500 * time.Millisecond)
  for {
    select {
    case <-tick:
      fmt.Println("tick.")
    case <-boom:
      fmt.Println("BOOM!")
      return
    default:
      fmt.Println("    .")
      time.Sleep(50 * time.Millisecond)
    }
  }
}

Вывод:

    .
    .
tick.
    .
    .
tick.
    .
    .
tick.
    .
    .
tick.
    .
    .
tick.
BOOM!


Читайте также:


Комментариев нет:

Отправить комментарий