|
|
@@ -0,0 +1,121 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+func main() {
|
|
|
+
|
|
|
+ go testRemoveDuplicates()
|
|
|
+
|
|
|
+ time.Sleep(1 * time.Second)
|
|
|
+
|
|
|
+ /*
|
|
|
+ channel := make(chan int)
|
|
|
+ go task(channel, 7)
|
|
|
+ fmt.Println(<-channel)
|
|
|
+ */
|
|
|
+
|
|
|
+ /*
|
|
|
+ channel := make(chan string, 5)
|
|
|
+ var testString string = "hello"
|
|
|
+ go task2(channel, testString)
|
|
|
+ */
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func channelTest1() {
|
|
|
+
|
|
|
+ // time.Sleep(1 * time.Second)
|
|
|
+
|
|
|
+ // channel := make(chan int)
|
|
|
+
|
|
|
+ // отправка данных в канал
|
|
|
+ // channel <- num
|
|
|
+
|
|
|
+ // получение данных из канала
|
|
|
+ // num = <- channel
|
|
|
+
|
|
|
+ // чтение данных из канала может происходить в цикле
|
|
|
+ // Цикл будет продолжаться до тех пор пока канал не будет закрыт.
|
|
|
+ /*
|
|
|
+ for v := range channel {
|
|
|
+ // обработка данных
|
|
|
+ }
|
|
|
+ */
|
|
|
+
|
|
|
+ // close(channel)
|
|
|
+
|
|
|
+ // c := make(chan int, 1) // Канал с буфером размера 1
|
|
|
+ // fmt.Println(len(c), cap(c)) // 0 1
|
|
|
+ // c <- 1
|
|
|
+ // fmt.Println(len(c), cap(c)) // 1 1
|
|
|
+ // <-c
|
|
|
+
|
|
|
+ // pipe := make(chan int) // Небуферизованный канал
|
|
|
+ // pipe := make(chan int, 0) // Небуферизованый канал с ёмкостью 0
|
|
|
+ // pipe := make(chan int, 5) // Буферизованный канал с ёикостью 5
|
|
|
+
|
|
|
+ // channel := make(chan string, 3) // Канал с буфером на 3 строки
|
|
|
+ // channel <- "A"
|
|
|
+ // fmt.Println(<-channel) // Извлекаем элемент из канала
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func channelTest2() {
|
|
|
+ c := make(chan int, 5)
|
|
|
+ for i := 0; i < 5; i++ {
|
|
|
+ go myFunc(c)
|
|
|
+ }
|
|
|
+ time.Sleep(1 * time.Second)
|
|
|
+ // fmt.Println("adafsdf")
|
|
|
+ fmt.Print(<-c)
|
|
|
+}
|
|
|
+
|
|
|
+func myFunc(c chan int) {
|
|
|
+ c <- cap(c)
|
|
|
+ // fmt.Println(cap(c))
|
|
|
+}
|
|
|
+
|
|
|
+func task(c chan int, n int) {
|
|
|
+ c <- n + 1
|
|
|
+}
|
|
|
+
|
|
|
+func task2(c chan string, s string) {
|
|
|
+ for i := 0; i < 5; i++ {
|
|
|
+ c <- s + " "
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func testRemoveDuplicates() {
|
|
|
+ inputStream := make(chan string, 5)
|
|
|
+ outputStream := make(chan string, 5)
|
|
|
+
|
|
|
+ go removeDuplicates(inputStream, outputStream)
|
|
|
+
|
|
|
+ inputStream <- "a"
|
|
|
+ inputStream <- "a"
|
|
|
+ inputStream <- "b"
|
|
|
+ inputStream <- "a"
|
|
|
+ inputStream <- "c"
|
|
|
+ close(inputStream)
|
|
|
+
|
|
|
+ fmt.Println(<-outputStream)
|
|
|
+ fmt.Println(<-outputStream)
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func removeDuplicates(inputStream chan string, outputStream chan string) {
|
|
|
+ var oldString string
|
|
|
+ for value := range inputStream {
|
|
|
+ if oldString != value {
|
|
|
+ outputStream <- value
|
|
|
+ oldString = value
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ defer func() {
|
|
|
+ close(outputStream)
|
|
|
+ }()
|
|
|
+}
|