channel.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func main() {
  7. go testRemoveDuplicates()
  8. time.Sleep(1 * time.Second)
  9. /*
  10. channel := make(chan int)
  11. go task(channel, 7)
  12. fmt.Println(<-channel)
  13. */
  14. /*
  15. channel := make(chan string, 5)
  16. var testString string = "hello"
  17. go task2(channel, testString)
  18. */
  19. }
  20. func channelTest1() {
  21. // time.Sleep(1 * time.Second)
  22. // channel := make(chan int)
  23. // отправка данных в канал
  24. // channel <- num
  25. // получение данных из канала
  26. // num = <- channel
  27. // чтение данных из канала может происходить в цикле
  28. // Цикл будет продолжаться до тех пор пока канал не будет закрыт.
  29. /*
  30. for v := range channel {
  31. // обработка данных
  32. }
  33. */
  34. // close(channel)
  35. // c := make(chan int, 1) // Канал с буфером размера 1
  36. // fmt.Println(len(c), cap(c)) // 0 1
  37. // c <- 1
  38. // fmt.Println(len(c), cap(c)) // 1 1
  39. // <-c
  40. // pipe := make(chan int) // Небуферизованный канал
  41. // pipe := make(chan int, 0) // Небуферизованый канал с ёмкостью 0
  42. // pipe := make(chan int, 5) // Буферизованный канал с ёикостью 5
  43. // channel := make(chan string, 3) // Канал с буфером на 3 строки
  44. // channel <- "A"
  45. // fmt.Println(<-channel) // Извлекаем элемент из канала
  46. }
  47. func channelTest2() {
  48. c := make(chan int, 5)
  49. for i := 0; i < 5; i++ {
  50. go myFunc(c)
  51. }
  52. time.Sleep(1 * time.Second)
  53. // fmt.Println("adafsdf")
  54. fmt.Print(<-c)
  55. }
  56. func myFunc(c chan int) {
  57. c <- cap(c)
  58. // fmt.Println(cap(c))
  59. }
  60. func task(c chan int, n int) {
  61. c <- n + 1
  62. }
  63. func task2(c chan string, s string) {
  64. for i := 0; i < 5; i++ {
  65. c <- s + " "
  66. }
  67. }
  68. func testRemoveDuplicates() {
  69. inputStream := make(chan string, 5)
  70. outputStream := make(chan string, 5)
  71. go removeDuplicates(inputStream, outputStream)
  72. inputStream <- "a"
  73. inputStream <- "a"
  74. inputStream <- "b"
  75. inputStream <- "a"
  76. inputStream <- "c"
  77. close(inputStream)
  78. fmt.Println(<-outputStream)
  79. fmt.Println(<-outputStream)
  80. }
  81. func removeDuplicates(inputStream chan string, outputStream chan string) {
  82. var oldString string
  83. for value := range inputStream {
  84. if oldString != value {
  85. outputStream <- value
  86. oldString = value
  87. }
  88. }
  89. defer func() {
  90. close(outputStream)
  91. }()
  92. }