#&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
передача в обработчик уже содержит свой собственный контекст , который вы можете использовать, если вам нужно.