|
|
@@ -0,0 +1,126 @@
|
|
|
+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")
|
|
|
+}
|