Programowanie w Go - #12 Kanały i instrukcja select
Doszliśmy do kanałów w Go, zatem czas i o nich trochę opowiedzieć. Z tego odcinka dowiesz się czym są kanały, jak ich używać i co to za instrukcja warunkowa select{}
, która do tej pory jeszcze się
w kursie nie pojawiła. W przypadku Go, kanałów nie możemy pominąć, bo jest to jeden z bardziej znanych elementów tego języka.
Spis treści:
- Film
- Przykład z filmu: kanał buforowany
- Przykład z filmu: kierunkowość kanałów
- Przykład z filmu: instrukcja select
Film
Przykład z filmu: kanał buforowany
1package main
2
3import "fmt"
4
5func main() {
6 alphabet := make(chan string, 2)
7 alphabet <- "a"
8 alphabet <- "b"
9 alphabet <- "c"
10 close(alphabet)
11
12 for val := range alphabet {
13 fmt.Println(val)
14 }
15
16}
Przykład z filmu: kierunkowość kanałów
1package main
2
3import "fmt"
4
5func onlyReceiving(c <-chan string) {
6 // c <- "aas" // error - receive only channel
7 fmt.Println(<-c)
8}
9
10func onlySending(c chan<- string) {
11 // fmt.Println(<-c) // error - send only channel
12 c <- "send only channel"
13}
14
15func main() {
16 toReceiveChan := make(chan string, 1)
17 toSendChan := make(chan string, 1)
18
19 toReceiveChan <- "toreceive"
20 toSendChan <- "tosend"
21
22 go onlyReceiving(toReceiveChan)
23 go onlySending(toSendChan)
24
25}
Przykład z filmu: instrukcja select
1package main
2
3import (
4 "fmt"
5)
6
7func main() {
8 chInt := make(chan int, 2)
9 chStr := make(chan string, 2)
10
11 chInt <- 10
12 chInt <- 20
13 chStr <- "hello"
14 chStr <- "world"
15
16 msgsNum := len(chInt) + len(chStr)
17 for i := 0; i < msgsNum; i++ {
18 select {
19 case num := <-chInt:
20 fmt.Println(num)
21 case str := <-chStr:
22 fmt.Println(str)
23 default:
24 fmt.Println("default nothing")
25 }
26 }
27
28 close(chInt)
29 close(chStr)
30}