Нет хорошего способа «прервать» выполнение программы в середине ее выполнения.
Go использует модель параллельного соединения fork-join, это означает, что вы «разветвляетесь», создавая новую программу, а затем не контролируете, как эта программа запланирована, пока вы не достигнете «точки соединения».Точка соединения - это своего рода синхронизация между несколькими программами.например, отправка значения по каналу.
Используя ваш конкретный пример, эта строка:
ch <- Response{data: "data", status: true}
... сможет отправлять значение, несмотря ни на что, потому что это буферизованный канал.,Но тайм-аут, который вы создали:
case <-time.After(50 * time.Millisecond):
return "Timed out", false
Эти тайм-ауты находятся на «получателе» или «считывателе» канала, а не на «отправителе».Как упоминалось в верхней части этого ответа, нет способа прервать выполнение программы без использования некоторых методов синхронизации.
Поскольку время ожидания истекает при чтении канала из канала, нет ничего, что могло бы остановитьвыполнение программы, отправляемой по каналу.