Тип chan

Тип chan в Go представляет канал для обмена данными между горутинами. Каналы позволяют передавать значения одного типа и обеспечивают синхронизацию при работе с параллельным кодом. Первым параметром объявления канала идет тип данных, которые будут передаваться, а вторым - направление передачи (если требуется).

Синтаксис

govar ch chan int
ch = make(chan int)

ch := make(chan string)
ch := make(chan bool, 10)

Создание и использование канала

Создадим канал для передачи целых чисел и отправим в него значение:

gopackage main

import "fmt"

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

  go func() {
    ch <- 42
  }()

  res := <-ch
  fmt.Println(res)
}

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

go42

Буферизированный канал

Создадим буферизированный канал с емкостью 2:

gopackage main

import "fmt"

func main() {
  ch := make(chan string, 2)

  ch <- "abcde"
  ch <- "12345"

  res1 := <-ch
  res2 := <-ch

  fmt.Println(res1)
  fmt.Println(res2)
}

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

go"abcde"
"12345"

Закрытие канала

Закроем канал и проверим, закрыт ли он:

gopackage main

import "fmt"

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

  go func() {
    ch <- 10
    ch <- 20
    close(ch)
  }()

  for res := range ch {
    fmt.Println(res)
  }
}

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

go10
20

Канал только для чтения

Создадим канал только для чтения данных:

gopackage main

import "fmt"

func main() {
  ch := make(chan string)
  ch <- "abcde"

  var readOnly <-chan string = ch
  res := <-readOnly

  fmt.Println(res)
}

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

go"abcde"

Канал только для записи

Создадим канал только для записи данных:

gopackage main

import "fmt"

func main() {
  ch := make(chan string)
  var writeOnly chan<- string = ch

  writeOnly <- "12345"

  res := <-ch
  fmt.Println(res)
}

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

go"12345"

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

  • функцию make,
    которая создает каналы
  • тип slice,
    который является динамическим массивом
  • тип map,
    который представляет коллекцию ключ-значение
  • тип pointer,
    который хранит адрес переменной