Каналы это типизированные "трубы", по которым вы можете посылать и получать значения с помощью оператора <-.
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
Читайте также:
- Основы языка Go: Go-процедуры (goroutines)
- Основы языка Go: Stringers
- Основы языка Go: методы, получатели и указатели
Комментариев нет:
Отправить комментарий