Context & select
ΠΠ°Π·ΠΎΠ²Π°Ρ ΡΠ°Π±ΠΎΡΠ° Ρ context ΠΈ Π²ΡΠ±ΠΎΡΠΎΠΌ select Π² Golang.
ΠΠ°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° (context.Context) Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π³ΠΎΡΡΠ½ΡΠΈΠ½, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ select Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΎΡΠΌΠ΅Π½Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°. Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Ρ ΡΠ°ΠΉΠΌΠ°ΡΡΠΎΠΌ Π΄Π»Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ Π²ΡΡΡΠ½ΡΡ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡ cancel.
package main
import (
"context"
"time"
"github.com/juju/zaputil/zapctx"
"go.uber.org/zap"
)
type key struct{}
func doWork(ctx context.Context) {
logger := zapctx.Logger(ctx)
logger.Info(ctx.Value(key{}).(string))
for {
select {
case <-ctx.Done():
logger.Info("ctx canceled")
return
default:
logger.Info("Working")
time.Sleep(time.Second)
}
}
}
func main() {
ctx := context.Background()
logger, _ := zap.NewProduction()
logger = logger.With(zap.String("env", "prod"))
logger.Info("Start app")
logCtx := zapctx.WithLogger(ctx, logger)
ctxLogWithValue := context.WithValue(logCtx, key{}, "iddqd")
ctxTimeout, _ := context.WithTimeout(ctxLogWithValue, time.Second*5)
doWork(ctxTimeout)
ctxCancel, cancel := context.WithCancel(ctxLogWithValue)
go doWork(ctxCancel)
time.Sleep(time.Second * 6)
cancel()
}