context.WithCancel(parent)?Возвращает копию контекста с новым каналом отмены и функцию cancel. Вызов cancel() отменяет возвращённый контекст и все производные от него; родительский parent не меняется. cancel() лучше вызывать через defer, чтобы освободить ресурсы.
ctx, cancel := context.WithCancel(parent)
defer cancel()
go worker(ctx)