Введение
Этот лабораторный проект旨在测试您对Golang中非阻塞通道操作的理解。您需要使用带有default
子句的select
语句来实现非阻塞发送、接收和多路选择。
This tutorial is from open-source community. Access the source code
💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал
Этот лабораторный проект旨在测试您对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
. Вы реализовали неблокирующее получение, неблокирующую отправку и многонаправленное неблокирующее ветвление.