dtelenkov 1 week ago
parent
commit
4828cac95d
2 changed files with 94 additions and 0 deletions
  1. 30 0
      go/stepik/3/blocking.go
  2. 64 0
      go/stepik/3/channel2.go

+ 30 - 0
go/stepik/3/blocking.go

@@ -0,0 +1,30 @@
+package main
+
+import (
+	"fmt"
+)
+
+func main() {
+	c := make(chan int)
+	quit := make(chan int)
+	go func() {
+		for i := 0; i < 10; i++ {
+			fmt.Println(<-c)
+		}
+		quit <- 0
+	}()
+	fibonacci(c, quit)
+}
+
+func fibonacci(c, quit chan int) {
+	x, y := 0, 1
+	for {
+		select {
+		case c <- x:
+			x, y = y, x+y
+		case <-quit:
+			fmt.Println("quit")
+			return
+		}
+	}
+}

+ 64 - 0
go/stepik/3/channel2.go

@@ -0,0 +1,64 @@
+package main
+
+import (
+	"fmt"
+)
+
+func main() {
+
+	// Конал создан, но не инициализирован (print вернет nil)
+	/*
+		var c chan int
+		fmt.Println(c)
+	*/
+
+	// канал - это указатель
+	/*
+		c := make(chan int, 1)
+		fmt.Printf("type of `c` is %T\n", c)
+		fmt.Printf("value of `c` is %v\n", c)
+
+		go channelReadWrite(c)
+
+		time.Sleep(1 * time.Second)
+	*/
+
+	/*
+		fmt.Println("main() started")
+		c := make(chan string)
+
+		go greet(c)
+
+		c <- "hello"
+		fmt.Println("main() stopped")
+	*/
+
+	// /*
+	c := make(chan int)
+
+	// Здесь будет блокировка горутина main() заблокируется
+	// до тех пор пока не будут считаны данные из канала
+	c <- 1
+
+	go channelRead(c)
+
+	// А так сработает
+	// c <- 1
+	// */
+	// time.Sleep(1 * time.Second)
+}
+
+func greet(c chan string) {
+	fmt.Println(<-c)
+}
+
+func channelReadWrite(c chan int) {
+	var data int
+	c <- 77
+	data = <-c
+	fmt.Println(data)
+}
+
+func channelRead(c chan int) {
+	fmt.Println(<-c)
+}