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

 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}