Использование контекста приложения в качестве родительского контекста запросов - PullRequest
0 голосов
/ 22 марта 2020

В настоящее время я передаю контекст приложения / основного уровня от main.go до repository.go, чтобы я мог использовать его в качестве "родительского" контекста для go с контекстом запроса. Это действительно / idiomati c использование или нет? Кроме того, я должен отказаться от идеи и просто использовать context.Background() в качестве «родительского» контекста для go с контекстом запроса вместо этого?

main. go

package main

import (
    "context"
    "internal/user"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    repo := user.NewRepository(ctx, db)

    // HTTP server is running.
}

внутренний / пользователь / хранилище. go

package user

import (
    "context"
    "database/sql"
    "time"
)

type Repository struct {
    *sql.DB
}

var appCTX context.Context

func NewRepository(ctx context.Context, db *sql.DB) Repository {
    appCTX = ctx

    return Repository{db}
}

func (r Repository) Insert(args ...interface{}) error {
    ctx, cancel := context.WithTimeout(appCTX, 5 * time.Millisecond)
    defer cancel()

    // Run query etc.
    res, err := r.ExecContext(ctx, `INSERT INTO .....`, args...)
}

1 Ответ

1 голос
/ 22 марта 2020

Использование контекста idiomati c состоит в том, чтобы передать его в качестве первого аргумента функции, а не сохранять в структурах. Это из контекста do c:

Не хранить контексты внутри типа структуры; вместо этого передайте Контекст явно каждой функции, которая в этом нуждается. Контекст должен быть первым параметром, обычно называемым ctx

Так что, даже если вы передаете основной контекст своей реализации, вы должны сделать это, передавая контекст каждой операции.

Каждая автономная операция (например, HTTP-запрос) должна создавать новый контекст. Если ваш main выполняет одну такую ​​автономную операцию, вы можете передать контекст следующим образом. Однако, если это серверное приложение, вы должны создать отдельный контекст для каждого обработчика запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...