Введение в использование каналов в GO и то, как они могут быть полезны в горутинах
Go очень увлекательный и простой в использовании язык GO в основном используется для написания высококлассного приложения, которое может обрабатывать тысячи запросов в секунду.
Сначала все о Go легко понять, но в большинстве случаев программы, написанные на Go, сильно сбивают с толку из-за параллелизма и асинхронности кода. Основная задача - понять, что такое канал и как его можно использовать с горутинами. Тот факт, что не во многих других популярных языках программирования есть похожая концепция, означает, что каналы - это одно понятие, которое вы должны потратить некоторое время на их изучение, если вы начинаете свой путь с Go.
Чтобы сначала понять каналы, давайте сначала разберемся с горутинами
package main
import (
"fmt"
"time"
)
func main() {
n := 2
// a go routine
go addTwo(n)
// wait for goroutine to finish
time.Sleep(time.Second)
}
func addTwo(num int) int {
result := num + 2
// print result
fmt.Println(result)
return result
}
Проблема с этой реализацией заключается в том, что эти две части нашего кода скорее не связаны. Как следствие :
- Мы не можем получить доступ к результату
addTwo
в функцииmain
. - У нас нет возможности узнать, когда завершится
addTwo
горутина. В результате мы должны приостановить функциюmain
, вызвавtime.Sleep
, что является взломом.
А вот и спаситель («Каналы на ходу»)
Канал дает нам возможность «соединить» различные параллельные части нашей программы. В этом случае мы можем соединить main () и addTwo ()
Каналы можно рассматривать как «каналы», которые соединяют различные части нашего кода.
Вы также можете объявить канал без указания направленности, что означает, что он может отправлять или получать данные:
package main import ( "fmt" ) func main() { n := 2 // create a multi directional channel // inject only int data type into this channel // use out <-chan int for send-only channels // use out chan<- int for
receive-only channels
out := make(chan int) // call go routine pass data and channel (act as an pipe) go addTwo(n, out)
// since until data is passed and printfmt.Println(<-out) } func addTwo(num int, out chan int) { result := num + 2 // inject result into out channel out <- result }
Оператор <-out
заблокирует код до получения данных по каналу out
. и fmt.Println(<-out)
распечатает данные на экране и выйдет из основного блока.
На этом мы закончили с простейшим объяснением канала на Go. Каналы в Go делают параллельное программирование намного проще, чем было бы без них, и трудно оценить объем кода, который нам don't
приходится писать из-за них.
Увидимся в следующий раз,
Аюш А. | Создатель Ester Network
https://ester.network