gpt4 book ai didi

go - 使用应用程序上下文作为查询的父上下文

转载 作者:行者123 更新时间:2023-12-01 22:15:06 25 4
gpt4 key购买 nike

我目前正在将应用程序/主上下文从main.go传递到repository.go,以便可以将其用作“父”上下文和查询上下文。这是有效/惯用用法吗?另外,我是否应该放弃这个想法,而只将context.Background()用作“父”上下文,而不是与查询上下文一起使用?

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.
}

内部/用户/存储库。

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...)
}

最佳答案

上下文的惯用用法是将其作为第一个函数参数传递,而不是存储在结构中。这来自上下文文档:

不要将上下文存储在结构类型中;而是将上下文明确传递给需要它的每个函数。 Context应该是第一个参数,通常命名为ctx

因此,即使将主要上下文传递给实现,也应该通过将上下文传递给每个操作来实现。

每个独立的操作(例如HTTP请求)都应创建一个新的上下文。如果您的主体执行这样的自包含操作,则可以像这样传递上下文。但是,如果这是服务器应用程序,则应为每个请求处理程序创建一个单独的上下文。

关于go - 使用应用程序上下文作为查询的父上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60801874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com