Тип chan
Тип chan в Go представляет канал для обмена данными между горутинами.
Каналы позволяют передавать значения одного типа и обеспечивают синхронизацию
при работе с параллельным кодом. Первым параметром объявления канала идет
тип данных, которые будут передаваться, а вторым - направление передачи
(если требуется).
Синтаксис
var ch chan int
ch = make(chan int)
ch := make(chan string)
ch := make(chan bool, 10)
Создание и использование канала
Создадим канал для передачи целых чисел и отправим в него значение:
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
ch <- 42
}()
res := <-ch
fmt.Println(res)
}
Результат выполнения кода:
42
Буферизированный канал
Создадим буферизированный канал с емкостью 2:
package main
import "fmt"
func main() {
ch := make(chan string, 2)
ch <- "abcde"
ch <- "12345"
res1 := <-ch
res2 := <-ch
fmt.Println(res1)
fmt.Println(res2)
}
Результат выполнения кода:
"abcde"
"12345"
Закрытие канала
Закроем канал и проверим, закрыт ли он:
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
ch <- 10
ch <- 20
close(ch)
}()
for res := range ch {
fmt.Println(res)
}
}
Результат выполнения кода:
10
20
Канал только для чтения
Создадим канал только для чтения данных:
package main
import "fmt"
func main() {
ch := make(chan string)
ch <- "abcde"
var readOnly <-chan string = ch
res := <-readOnly
fmt.Println(res)
}
Результат выполнения кода:
"abcde"
Канал только для записи
Создадим канал только для записи данных:
package main
import "fmt"
func main() {
ch := make(chan string)
var writeOnly chan<- string = ch
writeOnly <- "12345"
res := <-ch
fmt.Println(res)
}
Результат выполнения кода:
"12345"