| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- package main
- import (
- "fmt"
- )
- // -----------------------------------------------------------------
- // Работа с несколькими горутинами
- func square(c chan int) {
- fmt.Println("[square] reading")
- num := <-c
- c <- num * num
- }
- func cube(c chan int) {
- fmt.Println("[cube] reading")
- num := <-c
- c <- num * num * num
- }
- func main() {
- // unidirectonalChannel()
- // anonymousGoroutine()
- channelChannel()
- /*
- fmt.Println("[main] main() started")
- squareChan := make(chan int)
- cubeChan := make(chan int)
- go square(squareChan)
- go cube(cubeChan)
- testNum := 3
- fmt.Println("[main] sent testNum to squareChan")
- squareChan <- testNum
- fmt.Println("[main] resuming")
- fmt.Println("[main] sent testNum to cubeChan")
- cubeChan <- testNum
- fmt.Println("[main] resuming")
- fmt.Println("[main] reading from channels")
- squareVal, cubeVal := <-squareChan, <-cubeChan
- sum := squareVal + cubeVal
- fmt.Println("[main] sum of square and cube of", testNum, " is", sum)
- fmt.Println("[main] main() stopped")
- */
- }
- // -----------------------------------------------------------------
- // Однонаправленные каналы
- func greet(roc <-chan string) {
- fmt.Println("Hello " + <-roc + "!")
- // Это приведет к ошибке
- // roc <- "qwerty"
- }
- func unidirectonalChannel() {
- /*
- roc := make(<-chan int)
- soc := make(chan<- int)
- fmt.Printf("Data type of roc `%T`\n", roc)
- fmt.Printf("Data type of roc `%T`\n", soc)
- */
- fmt.Println("main() started")
- c := make(chan string)
- go greet(c)
- c <- "John"
- fmt.Println("main() stopped")
- }
- // -----------------------------------------------------------------
- // Анонимные горутины
- func anonymousGoroutine() {
- fmt.Println("main() started")
- c := make(chan string)
- // launch anonymous goroutine
- go func(c chan string) {
- fmt.Println("Hello " + <-c + "!")
- }(c)
- c <- "John"
- fmt.Println("main() stopped")
- }
- // -----------------------------------------------------------------
- // Канал с типом данных канала.
- // Канал - объкт первого класса.
- // gets a channels and writes a channel to it
- func greeter(cc chan chan string) {
- c := make(chan string)
- cc <- c
- }
- func channelChannel() {
- fmt.Println("main() started")
- cc := make(chan chan string)
- go greeter(cc) // start `greeter` goroutine using `cc` channel
- c := <-cc
- go greet(c)
- c <- "John"
- fmt.Println("main() stopped")
- }
|