Получение значений из каналов в Go - PullRequest
0 голосов
/ 04 июля 2018

Почему последний результат, возвращаемый из go sum(s[len(s)/2:], c) (второй), не может быть присвоен x? Два <-c смущают меня. Этот код взят из A Tour of Go - [Каналы] .

package main

import "fmt"

func sum(s []int, c chan int) {   // int is the return value type
  sum := 0
  for _, v := range s {
    sum += v
  }
  c <- sum // Sends sum to 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                 // receive from c

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

1 Ответ

0 голосов
/ 04 июля 2018

Вы имеете в виду эту строку?

x, y := <-c, <-c

Это «назначение кортежа».

В этом случае это будет эквивалентно выполнению:

x := <-c
y := <-c

Таким образом, второе значение, считанное из c, будет присвоено y.

Подробнее об этом можно прочитать здесь:

https://golang.org/ref/spec#Assignments

О порядке, в котором значения фактически записываются в c, поскольку здесь запускаются две независимые программы:

go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)

Порядок, в котором они заканчивают обработку и запись в c, не «гарантирован», поэтому можно ожидать, что одному из значений будет присвоено x и y в разных прогонах.

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

...