Введение
Этот лабораторный проект旨在测试您对 Golang 中非阻塞通道操作的理解。您需要使用带有default子句的select语句来实现非阻塞发送、接收和多路选择。
Неблокирующие операции с каналами
Задача, которую необходимо решить в этом лабораторном проекте, - это реализация неблокирующих операций с каналами с использованием оператора select с предложением default.
- Реализовать неблокирующее получение из канала с использованием оператора
selectс предложениемdefault. - Реализовать неблокирующую отправку в канал с использованием оператора
selectс предложениемdefault. - Реализовать многонаправленное неблокирующее ветвление с использованием оператора
selectс несколькими предложениямиcaseи предложениемdefault.
$ go run non-blocking-channel-operations.go
no message received
no message sent
no activity
Ниже представлен полный код:
// Базовые отправки и получение из каналов блокирующие.
// Однако, мы можем использовать `select` с предложением `default` для
// реализации _неблокирующих_ отправок, получений и даже
// неблокирующих многонаправленных `select`.
package main
import "fmt"
func main() {
messages := make(chan string)
signals := make(chan bool)
// Вот неблокирующее получение. Если значение доступно в `messages`,
// то `select` будет использовать вариант `<-messages` с этим значением.
// Если нет, то немедленно будет использоваться вариант `default`.
select {
case msg := <-messages:
fmt.Println("received message", msg)
default:
fmt.Println("no message received")
}
// Неблокирующая отправка работает аналогично. Здесь `msg`
// не может быть отправлено в канал `messages`, потому что
// канал не имеет буфера и нет приемника.
// Поэтому выбирается вариант `default`.
msg := "hi"
select {
case messages <- msg:
fmt.Println("sent message", msg)
default:
fmt.Println("no message sent")
}
// Мы можем использовать несколько вариантов `case` выше предложения `default`
// для реализации многонаправленного неблокирующего ветвления.
// Здесь мы пытаемся выполнить неблокирующие получение из обоих `messages` и `signals`.
select {
case msg := <-messages:
fmt.Println("received message", msg)
case sig := <-signals:
fmt.Println("received signal", sig)
default:
fmt.Println("no activity")
}
}
Резюме
В этом лабораторном проекте вы узнали, как реализовать неблокирующие операции с каналами с использованием оператора select с предложением default. Вы реализовали неблокирующее получение, неблокирующую отправку и многонаправленное неблокирующее ветвление.