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") }