Ядро пакета context
Ядром пакета context является тип Context:
// Context содержит в себе время окончания существования,
// сигнал отмены и значения области запроса в границах API.
// Его методы безопасны для одновременного использования
// несколькими горутинами.
type Context interface {
// Done возвращает закрытый канал при отмене текущего Context
// или при истечение времени ожидания.
Done() <-chan struct{}
// Err указывает, почему этот контекст был отменен,
// после того, как канал Done закрылся.
Err() error
// Deadline возвращает время, когда этот Context будет отменен, если оно имеется.
Deadline() (deadline time.Time, ok bool)
// Value возвращает значение, связанное с ключом, или nil, если оно отсутствует.
Value(key interface{}) interface{}
}
(Здесь вы можете ознакомится с более подробным описанием)
Метод Done возвращает канал, который действует как сигнал отмены для функций, выполняемых от имени Context: когда канал закрыт, функции должны отказаться от работы и возврата. Метод Err возвращает ошибку, указывающую, почему Context был отменен. В статье Piplines and Cancelation более подробно обсуждается идиома канала Done.
Context не имеет метода Cancel по той же причине, что и канал Done: функция, получающая сигнал отмены, обычно не та, которая посылает сигнал. Когда родительская операция запускает goroutines для под-операций, эти под-операции не могут отменить родителя. Вместо этого функция WithCancel (описанная ниже) обеспечивает способ отмены нового значения Context.
Context безопасен для одновременного использования несколькими горутинами. Код может передать один Context любому числу горутин и отменять этот Context передавая сигнал всем горутинам.
Метод Deadline позволяет функциям определить, должны ли они вообще начинать работу; если осталось слишком мало времени, это может оказаться нецелесообразным. Код также может использовать deadline для установки тайм-аутов для операций ввода-вывода.
Value позволяет типу Context передавать данные с областью действия запроса. Эти данные должны быть безопасными для одновременного использования несколькими горутинами.