Задать вопрос
@VadimRublev
Go, front-end (ванильный).

Почему при чтении из канала с циклом появляется задержка в начале работы?

Почему при чтении из канала в цикле for в main() появляется задержка в начале работы?
Без for работает без задержки (хотя и неправильно, понятно).
package main

import (
	"fmt"
	"time"
)

func Send(myChan chan int) {
	var testStatus = 200 // Тест-статус результата (меняется непредсказуемо с каждой итерацией цикла): 100 - успешно; 200 - неудачно.

	// Значения итогового_статуса (передается в main()): 1 - "успешно"; 2 - "неудачно впервые"; 3 = "неудачны все попытки".
	for i := 1; i < 4; i++ { // максимальное количество попыток.
		if testStatus == 100 { // Если успешно.
			fmt.Println("Успешно. i =", i)
			myChan <- 1
			close(myChan)
		}

		if testStatus == 200 && i == 1 { // Неудачно впервые.
			fmt.Println("Неудачно впервые... i =", i)
			myChan <- 2
		}

		time.Sleep(time.Second * 2)
	}

	fmt.Println("\nНеудачны все попытки.")
	myChan <- 3
	close(myChan)
}

func main() {
	var myChan = make(chan int, 2) // Канал для возврата итогового_статуса. Буферизирован - чтобы не блокировалось.
	go Send(myChan)

	for {
		status_Ch := <-myChan // Возвращенный каналом статус_отправки (1 / 2 / 3).
		if status_Ch == 1 {
			fmt.Println("main: Успешно! status_Ch =", status_Ch)
		}

		if status_Ch == 2 {
			fmt.Println("main: Неудачно впервые, status_Ch =", status_Ch)
		}

		if status_Ch == 3 {
			fmt.Println("main: Все попытки неудачны, status_Ch =", status_Ch)
		}
	}
}


Песочница: https://go.dev/play/p/DUbMwOjEfc4
  • Вопрос задан
  • 76 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@falconandy
1. появляется задержка в начале работы - не понял, что за задержка. Поясните по возможности
2. status_Ch := <-myChan для закрытого канала будет возвращать zero-значание (в данном случае 0) и цикл никогда не завершится. Проще всего переделать на for status_Ch := range myChan
3.
var testStatus = 200 // Тест-статус результата (меняется непредсказуемо с каждой итерацией цикла): 100 - успешно; 200 - неудачно.
- вроде testStatus нигде не меняется
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы