Как я могу иметь две функции одной и той же функции, которые смотрят на значения друг друга? - PullRequest
3 голосов
/ 20 февраля 2020

Я пытаюсь получить функцию, которую я могу вызвать с двумя процедурами и разными параметрами. Каждый будет манипулировать своей собственной строкой, и они будут передавать свои строки друг другу через канал и сравнивать результаты. Здесь - моя попытка (Go Детская площадка связана):

func swap_values(str string, strChan1 chan string, strChan2 chan string, done chan bool) {
  str += "test"
  strChan1 <- str
  <-strChan2
  done <- true
}

, и это взаимоблокировка. Для двух моих вызовов функции я меняю каналы так, что strChan1 - это отдельный канал для каждого. Как я могу исправить это, чтобы не тупик и не выполнить sh, что я хочу? Опять же, я буду сравнивать строки и делать дополнительные манипуляции, это всего лишь подтверждение концепции для получения обоих.

1 Ответ

3 голосов
/ 20 февраля 2020

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

Самый простой способ справиться с этим - использовать канал с размером 1, поэтому запись может продолжаться без ожидания читателя.

strChan1 := make(chan string,1)
strChan2 := make(chan string,1)

Если вам нужно использовать каналы 0 длины, вам нужно использовать select, чтобы приспособить различные упорядочения goroutines:

select {
  case strChan1 <- str:
     <-strChan2
  case <-strChan2:
     strChan1 <- str
}
...