как сделать так, чтобы было безопасно производить и потреблять данные по каналу

#go #channel

#Вперед #канал

Вопрос:

Я новичок в golang, вот моя цель, я хочу запустить 2 подпрограммы одновременно с общим каналом, потребитель должен запускаться после создания канала и всегда получать данные до закрытия канала, мой шаблон кода, как показано ниже:

 var userChannel chan string
for index := 0; index < *clientNums; index   {
        wg.Add(1)
        go run1()
        go run2()
    }
    wg.Wait()

}

func run1() {
   defer wg.Done()
   // ...some logic
   userChannel = make(chan string, *readUserNums)
   for index := 0; index < *readUserNums; index   {
         //...some logic
         userChannel <- userId
         //...some logic

   }
   close(userChannel)
}
func run2() {
   for sendId := range userChannel {
       //...some logic
}
}
  

в моем коде, если run2 запустить первым, это вызовет панику, поскольку канал не был создан и в канале нет данных. как я могу достичь своей цели? Спасибо

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

1. Либо сначала создайте канал, а затем передайте его обеим функциям, либо выполните run1 вызов run2 .

2. да, я вижу, попробую

Ответ №1:

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

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

1. хорошо, понял, еще один вопрос, если канал не был записан ни в какие данные, когда для канала ..range в run2 , что произойдет? просто ждать, пока данные не будут вставлены в канал?

Ответ №2:

Даже если на userChannel начальном этапе данные отсутствуют, это не будет проблемой при условии, что userChannel создан, здесь происходит сбой, потому что канал не создан.

Всегда рекомендуется создавать канал перед вызовом run1 или run2 и передавать канал.

К вашему СВЕДЕНИЮ: если канал создается, если на канале нет данных, и если мы попытаемся прочитать данные из канала, это будет блокирующий вызов и будет ждать, пока данные не поступят в ожидающий канал.