Неблокирующие операции с каналами

Beginner

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. Вы реализовали неблокирующее получение, неблокирующую отправку и многонаправленное неблокирующее ветвление.