«Контекст Golang» относится к пакету контекста на языке программирования Go (Golang). Пакет контекста предоставляет способ распространения сигналов отмены, сроков и других значений области запроса через границы API и горутины.
Вот некоторые часто используемые методы и функции, предоставляемые контекстным пакетом, а также примеры кода:
context.Background(): эта функция возвращает пустой контекст, с которым не связаны никакие значения или сроки. Обычно он используется в качестве контекста верхнего уровня для запроса или основного контекста.
package main
import (
"context"
"fmt"
)
func main() {
ctx := context.Background()
fmt.Println(ctx)
}
context.WithCancel(parentContext): эта функция возвращает производный контекст и функцию отмены. Производный контекст отменяется при вызове функции отмены или при отмене родительского контекста.
package main
import (
"context"
"fmt"
"time"
)
func main() {
parentCtx := context.Background()
ctx, cancel := context.WithCancel(parentCtx)
go func() {
time.Sleep(time.Second * 3)
cancel() // cancel the context after 3 seconds
}()
select {
case <-ctx.Done():
fmt.Println("Context canceled")
}
}
context.WithDeadline(parentContext, period): эта функция возвращает производный контекст и функцию отмены. Производный контекст отменяется по истечении крайнего срока или при отмене родительского контекста, в зависимости от того, что произойдет раньше.
package main
import (
"context"
"fmt"
"time"
)
func main() {
parentCtx := context.Background()
deadline := time.Now().Add(time.Second * 5) // set a deadline of 5 seconds from now
ctx, cancel := context.WithDeadline(parentCtx, deadline)
go func() {
time.Sleep(time.Second * 3)
cancel() // cancel the context after 3 seconds
}()
select {
case <-ctx.Done():
fmt.Println("Context canceled")
case <-time.After(time.Second * 6):
fmt.Println("Deadline exceeded")
}
}
context.WithValue(parentContext, key, value): эта функция возвращает производный контекст со связанной с ним парой ключ-значение. Производный контекст наследует сигнал отмены и сроки из родительского контекста.
package main
import (
"context"
"fmt"
)
type key string
func main() {
parentCtx := context.Background()
ctx := context.WithValue(parentCtx, key("username"), "John")
if val := ctx.Value(key("username")); val != nil {
fmt.Println(val)
}
}