вторник, 15 января 2019 г.

Основы Go: каналы

Каналы это типизированные "трубы", по которым вы можете посылать и получать значения с помощью оператора <-.

ch <- v    // Послать v в канал ch.
v := <-ch  // Получить из канала ch, и
           // присвоить значение переменной v.

(Данные перемещаются в направлении стрелки.)

Так же как карты и срезы, каналы должны быть созданы перед использованием:

ch := make(chan int)

По умолчанию отправление и получение блокируются до тех пор, пока другая сторона не готова. Это позволят go-процедурам синхронизироваться без явного использования блокировок и условных переменных.

Данный пример суммирует числа среза, распределяя работу между go-процедурами. Как только обе go-процедуры закончили свои вычисления, производится вычисление финального результата.

package main

import "fmt"

func sum(s []int, c chan int) {
  sum := 0
  for _, v := range s {
    sum += v
  }
  c <- sum // отправить sum к c
}

func main() {
  s := []int{7, 2, 8, -9, 4, 0}

  c := make(chan int)
  go sum(s[:len(s)/2], c)
  go sum(s[len(s)/2:], c)
  x, y := <-c, <-c // получить из c

  fmt.Println(x, y, x+y)
}

Вывод:

-5 17 12


Читайте также:


Комментариев нет:

Отправить комментарий