Руководство по контексту Golang: методы и примеры кода

«Контекст Golang» относится к пакету контекста на языке программирования Go (Golang). Пакет контекста предоставляет способ распространения сигналов отмены, сроков и других значений области запроса через границы API и горутины.

Вот некоторые часто используемые методы и функции, предоставляемые контекстным пакетом, а также примеры кода:

  1. context.Background(): эта функция возвращает пустой контекст, с которым не связаны никакие значения или сроки. Обычно он используется в качестве контекста верхнего уровня для запроса или основного контекста.
package main
import (
    "context"
    "fmt"
)
func main() {
    ctx := context.Background()
    fmt.Println(ctx)
}
  1. 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")
    }
}
  1. 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")
    }
}
  1. 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)
    }
}