Введение в использование каналов в 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 print
        fmt.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