Что будет, если вызвать cancel несколько раз

«Что будет, если вызвать cancel несколько раз» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При повторном вызове cancel() для контекста ничего страшного не произойдет - последующие вызовы просто игнорируются. Контекст переходит в canceled состояние только при первом вызове, дальше остается в этом состоянии.

ctx, cancel := context.WithCancel(context.Background())
cancel() // устанавливает canceled = true
cancel() // ничего не делает, т.к. уже canceled
cancel() // тоже ничего

Это безопасно и часто используется в defer:

defer cancel() // гарантирует отмену, даже если она уже была

Важно: сама функция cancel() не является потокобезопасной - вызывать её из разных горутин без синхронизации нельзя.