Go 1.21 - Usando contexto sem cancelamento

Às vezes pode ser necessário usar o contexto apenas pelos valores, sem necessidade do cancelamento, até o Go 1.20 para solucionar isso era necessário criar uma struct que retornava somente os valores do contexto, removendo a função de cancelamento.

A partir do Go 1.21, foi adicionado a função context.WithoutCancel que cria um novo contexto sem a função de cancelamento.

Na prática, ficaria assim:

func doSomethingAsync(ctx context.Context) {
	slog.InfoContext(ctx, "Running Async Process")
}

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
	defer cancel()

	go doSomethingAsync(context.WithoutCancel(ctx))
}

Neste exemplo, o contexto ctx é passado para a função doSomethingAsync que não tem a necessidade de cancelamento, então usamos o context.WithoutCancel(ctx) para criar um novo contexto sem o cancelamento.

Isso é útil para evitar que o contexto seja cancelado acidentalmente, ou para evitar que o contexto seja cancelado por um código que não deveria cancelá-lo.

Para mais informações, veja a documentação oficial .

Espero que tenha gostado, até a próxima!