Как передать глобальные переменные и контекст перехода в Go handlerfunc

#&o #redis #httphandler #&o-&orm

#Вперед #redis #httphandler #&o-&orm

Вопрос:

Итак, я вроде как новичок в программировании и Go, так что простите меня, если я сделаю что-то не так. Я создаю rest API с помощью Go. Я использую GORM для доступа к моей базе данных Postresql, и я хочу использовать Redis для хранения веб-ключей JSON. Контекст перехода — это то, что мне еще предстоит понять, но мне это нужно, чтобы настроить параметры в Redis в соответствии с документами, подобными этому:

 Set(ctx Context, key strin&, value interface{}, expiration Duration) *StatusCmd
  

Как я вижу это сейчас, я могу сделать две вещи для доступа к Redis, Go Context и DB в обработчике, не предоставляя ему 3 параметра. Передайте обработчику структуру, подобную приведенной ниже

 type env struct {
    ctx *context.Context
    db  *&orm.DB
    rdb *redis.Client
}

handler.ListItems(env{ctx: context.TODO(), db: &orm.DB, redis.Client})
  

или сохранить переменные в контексте Go

 ctx := context.WithValue(context.Back&round(), "db", &orm.DB)
ctx = context.WithValue(ctx, "rdb", redis.Client)

handler.ListItems(ctx)
  

Итак, мой вопрос: какова наилучшая практика в этом сценарии и почему?

Комментарии:

1. Что возвращает ListItems, обработчик? или список элементов? Потому что, если он возвращает обработчик, то вы, скорее всего, не захотите предоставлять ему контекст.

2. Он возвращает обработчик, я думал, что вы всегда должны инициировать контекст в func main ? Должен ли я делать это внутри самого обработчика?

3.&olan&.or&/pk&/context/#Context «Контекст пакета определяет тип контекста, который переносит крайние сроки, сигналы отмены и другие значения, зависящие от запроса, через границы API и между процессами».

4. Обратите также внимание, что каждая *http.Request передача в обработчик уже содержит свой собственный контекст , который вы можете использовать, если вам нужно.