Default в select

Ключевое слово default в конструкции select позволяет выполнить код, если ни один из каналов не готов к отправке или получению данных. Это делает операцию неблокирующей. В первом параметре мы передаем каналы для чтения или записи, во втором параметре мы указываем действие по умолчанию, которое выполнится, если ни один канал не готов.

Синтаксис

goselect {
case <-ch1:
  // Действие при получении из ch1
case ch2 <- val:
  // Действие при отправке в ch2
default:
  // Действие, если ни один канал не готов
}

Пример

Давайте создадим небуферизированный канал и попробуем получить из него данные с использованием default:

gopackage main

import "fmt"

func main() {
  ch := make(chan int)

  select {
  case val := <-ch:
    fmt.Println("Received:", val)
  default:
    fmt.Println("No data available")
  }
}

Результат выполнения кода:

go"No data available"

Пример

Давайте попробуем отправить данные в канал, который не имеет получателя:

gopackage main

import "fmt"

func main() {
  ch := make(chan int)

  select {
  case ch <- 42:
    fmt.Println("Sent: 42")
  default:
    fmt.Println("Cannot send, no receiver")
  }
}

Результат выполнения кода:

go"Cannot send, no receiver"

Пример

Давайте рассмотрим ситуацию, когда один из каналов готов к операции, и default не выполняется:

gopackage main

import "fmt"

func main() {
  ch := make(chan int, 1)
  ch <- 100

  select {
  case val := <-ch:
    fmt.Println("Received:", val)
  default:
    fmt.Println("No data available")
  }
}

Результат выполнения кода:

go"Received: 100"

Пример

Давайте используем default для неблокирующей проверки нескольких каналов:

gopackage main

import "fmt"

func main() {
  ch1 := make(chan int)
  ch2 := make(chan string)

  select {
  case val := <-ch1:
    fmt.Println("From ch1:", val)
  case msg := <-ch2:
    fmt.Println("From ch2:", msg)
  default:
    fmt.Println("No data from any channel")
  }
}

Результат выполнения кода:

go"No data from any channel"

Смотрите также

  • инструкцию select,
    которая позволяет работать с несколькими каналами
  • оператор chan,
    который используется для создания каналов
  • функцию close,
    которая закрывает канал для отправки данных
  • конструкцию goroutine,
    которая запускает функции в параллельных потоках