Non Blocking Channel Operations

Не Блокуючі Операції на Каналах|Non-Blocking Channel Operations #

// Базові надсилання та отримання на каналах це блокуючі операції.
// Однак, ми можемо використовувати `select` з умовою `default`
// для реалізації _не блокуючих відправлень_, і навіть для
// не блокуючих різнонаправлених `select`ів.

package main

import "fmt"

func main() {
	messages := make(chan string)
	signals := make(chan bool)

	// Ось не блокуюче отримання. Якщо значення доступне
	// в каналі `messages` тоді `select` підбере умову
	// <nobr>`<-messages`</nobr> в `case` з цим значенням. А якщо значення
	// не доступне - то негайно буде обрана стандартна умова `default`.
	select {
	case msg := <-messages:
		fmt.Println("отримане повідомлення", msg)
	default:
		fmt.Println("жодних повідомлень не отримано")
	}

	// Не блокуючі надсилання працюють схожим чином, тут
	// `msg` не може бути надіслано до каналу `messages`,
	// тому що цей канал не є буферизованим і тому що немає
	// отримувача. Саме тому відбудеться стандартна умова `default`.
	msg := "привіт"
	select {
	case messages <- msg:
		fmt.Println("надіслано повідомлення", msg)
	default:
		fmt.Println("жодних повідомлень не надіслано")
	}

	// Над стандартною умовою `default` дозволяється мати
	// більш ніж одну умови, для імплементації різнонаправлених
	// `select`ів, умови яких будуть чекати отримання як
	// `messages`, так і `signals`.
	select {
	case msg := <-messages:
		fmt.Println("отримано повідомлення", msg)
	case sig := <-signals:
		fmt.Println("отриманий сигнал", sig)
	default:
		fmt.Println("жодної активності")
	}
}
$ go run non-blocking-channel-operations.go
жодних повідомлень не отримано
жодних повідомлень не надіслано
жодної активності