Вам нужен буфер достаточного размера. Для простых случаев может работать буферизованный канал Go.
Спросите себя - сколько данных нужно хранить во время этой задержки - у вас должен быть разумный верхний предел. Например, если ваш поток доставляет до N пакетов в секунду, то для задержки на 7 минут вам нужно хранить 420N пакетов.
Спросите себя - что произойдет, если за окно задержки поступит больше данных, чем ожидалось? Вы можете выбросить новые данные, или выбросить старые данные, или просто заблокировать входной поток. Какие из них возможны для вашего сценария? Каждый из них приводит к немного другому решению.
Спросите себя - как рассчитывается задержка? С момента создания потока? С момента поступления каждого пакета? Задержка для каждого пакета отдельно или только для первого пакета в потоке?
Вам нужно будет значительно сузить выбор дизайна здесь, чтобы разработать пример кода.
Для некоторого подмножества этих вариантов дизайна вот простой способ добавить задержку между каналами для каждого сообщения:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
// in is a channel of strings with a buffer size of 10
in := make(chan string, 10)
// out is an unbuffered channel
out := make(chan string)
// this goroutine forwards messages from in to out, ading a delay
// to each message.
const delay = 3 * time.Second
go func() {
for msg := range in {
time.Sleep(delay)
out <- msg
}
close(out)
}()
var wg sync.WaitGroup
wg.Add(1)
// this goroutine drains the out channel
go func() {
for msg := range out {
fmt.Printf("Got '%s' at time %s\n", msg, time.Now().Format(time.Stamp))
}
wg.Done()
}()
// Send some messages into the in channel
fmt.Printf("Sending '%s' at time %s\n", "joe", time.Now().Format(time.Stamp))
in <- "joe"
time.Sleep(2 * time.Second)
fmt.Printf("Sending '%s' at time %s\n", "hello", time.Now().Format(time.Stamp))
in <- "hello"
time.Sleep(4 * time.Second)
fmt.Printf("Sending '%s' at time %s\n", "bye", time.Now().Format(time.Stamp))
in <- "bye"
close(in)
wg.Wait()
}