type Context
Context содержит deadline, сигнал отмены и другие значения через границы API.
Методы контекста могут вызываться одновременно несколькими горутинами.
type Context interface {
// Deadline возвращает время, когда работа, выполненная от имени этого контекста,
// должна быть прервана. Deadline возвращает ok==false, если Deadline не установлен.
// Последовательные вызовы к Deadline возвращают одинаковые результаты.
Deadline() (deadline time.Time, ok bool)
// Done возвращает канал, закрывающийся, когда работа,
// выполненная от имени этого контекста, должна быть отменена.
// Если этот контекст не может быть отменен, можно вернуть nil.
// Последовательные вызовы Done возвращают одно и то же значение.
//
// WithCancel организует закрытие канала Done при вызове отмены;
// WithDeadline организует закрытие канала Done по истечении deadline;
// WithTimeout организует закрытие канала Done, когда истечет тайм-аут.
//
// Done предоставляется для использования в инструкциях SELECT:
//
// // Поток создает значения с помощью DoSomething и отправляет их до тех пор,
// // пока DoSomething не вернет ошибку или ctx.Done не закроется.
// func Stream(ctx context.Context, out chan<- Value) error {
// for {
// v, err := DoSomething(ctx)
// if err != nil {
// return err
// }
// select {
// case <-ctx.Done():
// return ctx.Err()
// case out <- v:
// }
// }
// }
//
// См. Https://blog.golang.org/pipelines для получения дополнительных примеров того,
// как использовать канал Done для отмены.
Done() <-chan struct{}
// Если Done еще не закрыт, Err возвращает nil.
// Если Done закрыт, Err возвращает non-nil ошибку, потому что:
// Canceled, если контекст был отменен, либо
// DeadlineExceeded, если deadline был пройден.
// После того, как Err вернет non-nil ошибку,
// последовательные вызовы Err будут возвращать ту же ошибку.
Err() error
// Value возвращает значение, связанное с текущим контекстом для ключа,
// или nil, если значение не связано с ключом.
// Последовательные вызовы значения с одним и тем же ключом возвращает тот же результат.
//
// Используйте значения контекста только для данных с запросами,
// которые проходят через процессы и границы API,
// а не для передачи необязательных параметров для функций.
//
// Ключ идентифицирует конкретное значение в Context.
// Функции, которые хотят хранить значения в Context,
// обычно выделяют ключ в глобальной переменной,
// а затем используют этот ключ в качестве аргумента context.WithValue и Context.Value.
// Ключом может быть любой тип, поддерживающий равенство;
// пакеты должны определять ключи как неэкспортируемые, чтобы избежать конфликтов.
//
// Пакеты, которые определяют Context key ключ,
// должны предоставлять безопасные типы доступа для значений,
// хранящихся с помощью этого ключа:
//
// // Пакет user определяет тип User, который хранится в Contexts.
// package user
//
// import "context"
//
// // User - это тип значения, хранящийся в Contexts.
// type User struct {...}
//
// // key — это неэкспортируемый тип ключей, определенных в этом пакете.
// // Это предотвращает конфликты с ключами, определенными в других упаковках.
// type key int
//
// // userKey - это ключ для значений user.User в Contexts. Он неэкспортируемый;
// // клиенты используют user.NewContext и user.FromContext
// // вместо прямого использования этого ключа.
// var userKey key = 0
//
// // NewContext возвращает новый Context, который имеет значение u.
// func NewContext(ctx context.Context, u *User) context.Context {
// return context.WithValue(ctx, userKey, u)
// }
//
// // FromContext возвращает значение User, сохраненное в ctx, если оно есть.
// func FromContext(ctx context.Context) (*User, bool) {
// u, ok := ctx.Value(userKey).(*User)
// return u, ok
// }
Value(key interface{}) interface{}
}