two_goroutine.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // -----------------------------------------------------------------
  6. // Работа с несколькими горутинами
  7. func square(c chan int) {
  8. fmt.Println("[square] reading")
  9. num := <-c
  10. c <- num * num
  11. }
  12. func cube(c chan int) {
  13. fmt.Println("[cube] reading")
  14. num := <-c
  15. c <- num * num * num
  16. }
  17. func main() {
  18. // unidirectonalChannel()
  19. // anonymousGoroutine()
  20. channelChannel()
  21. /*
  22. fmt.Println("[main] main() started")
  23. squareChan := make(chan int)
  24. cubeChan := make(chan int)
  25. go square(squareChan)
  26. go cube(cubeChan)
  27. testNum := 3
  28. fmt.Println("[main] sent testNum to squareChan")
  29. squareChan <- testNum
  30. fmt.Println("[main] resuming")
  31. fmt.Println("[main] sent testNum to cubeChan")
  32. cubeChan <- testNum
  33. fmt.Println("[main] resuming")
  34. fmt.Println("[main] reading from channels")
  35. squareVal, cubeVal := <-squareChan, <-cubeChan
  36. sum := squareVal + cubeVal
  37. fmt.Println("[main] sum of square and cube of", testNum, " is", sum)
  38. fmt.Println("[main] main() stopped")
  39. */
  40. }
  41. // -----------------------------------------------------------------
  42. // Однонаправленные каналы
  43. func greet(roc <-chan string) {
  44. fmt.Println("Hello " + <-roc + "!")
  45. // Это приведет к ошибке
  46. // roc <- "qwerty"
  47. }
  48. func unidirectonalChannel() {
  49. /*
  50. roc := make(<-chan int)
  51. soc := make(chan<- int)
  52. fmt.Printf("Data type of roc `%T`\n", roc)
  53. fmt.Printf("Data type of roc `%T`\n", soc)
  54. */
  55. fmt.Println("main() started")
  56. c := make(chan string)
  57. go greet(c)
  58. c <- "John"
  59. fmt.Println("main() stopped")
  60. }
  61. // -----------------------------------------------------------------
  62. // Анонимные горутины
  63. func anonymousGoroutine() {
  64. fmt.Println("main() started")
  65. c := make(chan string)
  66. // launch anonymous goroutine
  67. go func(c chan string) {
  68. fmt.Println("Hello " + <-c + "!")
  69. }(c)
  70. c <- "John"
  71. fmt.Println("main() stopped")
  72. }
  73. // -----------------------------------------------------------------
  74. // Канал с типом данных канала.
  75. // Канал - объкт первого класса.
  76. // gets a channels and writes a channel to it
  77. func greeter(cc chan chan string) {
  78. c := make(chan string)
  79. cc <- c
  80. }
  81. func channelChannel() {
  82. fmt.Println("main() started")
  83. cc := make(chan chan string)
  84. go greeter(cc) // start `greeter` goroutine using `cc` channel
  85. c := <-cc
  86. go greet(c)
  87. c <- "John"
  88. fmt.Println("main() stopped")
  89. }