Maison >développement back-end >Golang >Application Golang cli - comment utiliser correctement le contexte ?
Application Golang cli - comment utiliser correctement le contexte ? L'éditeur PHP Yuzai vous présentera comment utiliser correctement le contexte dans l'application cli de Golang. Lors du développement d'applications cli, le contexte est très important, il peut nous aider à gérer l'état de l'application, à transmettre les paramètres et les erreurs, etc. Cet article expliquera le concept de contexte en détail et donnera quelques exemples d'applications pratiques pour vous aider à mieux comprendre et appliquer le contexte. Que vous soyez débutant ou développeur expérimenté, cet article vous aidera. Plongeons dans le contexte dans une application Golang cli !
Je suis nouveau sur Golang et un peu confus quant au contexte et à la façon d'utiliser le contexte dans l'application Golang. Plus précisément, je développe une application cli qui n'a besoin que d'accéder à Mongo, par exemple.
J'aime - Je crée simplement une seule variable de contexte ctx partagée, puis je l'utilise pour toute action nécessitant un contexte, est-ce correct ?
Est-ce que toute action nécessitant du contexte redémarrera le minuteur de 5 secondes ? Ou est-ce une minuterie partagée ?
package main import ( "context" "log" "os" "time" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/mongo/readpref" ) func main() { log.SetOutput(os.Stdout) // Create a context with a timeout of 5 seconds //This defines a timeout context that will be canceled after 5 seconds. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) // always defer in case func returns early defer cancel() //Creates a new ClientOptions instance. clientOptions := options.Client() clientOptions = clientOptions.ApplyURI("mongodb+srv://127.0.0.1?retryWrites=true&w=majority") //Connect to mongo client, err := mongo.Connect(ctx, clientOptions) defer client.Disconnect(ctx) if err != nil { log.Fatal(err) } //Test connection to the database log.Println("I: test mongo connection using ping") err = client.Ping(ctx, readpref.Primary()) if err != nil { log.Fatal(err) } log.Println("I: Fin") }
Si vous y réfléchissez, context.context
可以“水平”共享(意思是在不属于同一调用堆栈的操作之间)是没有意义的。 golang context
提供了要执行操作(包括调用堆栈中其下方的任何嵌套操作)的上下文 - 例如“在 x 秒内”,以防止由于通信延迟等而挂起。因此,如果您发出并行 10 个请求,您应该为每个请求提供自己的上下文 - 您可能不希望第十个请求失败,因为第一个请求失败了。如果您只是使用 context.background()
或 context.todo()
,没有进一步的装饰,您可能不需要在第一次创建它时将 context
est stocké dans une variable - vous pouvez le créer au moment de la création et le transmettre à la première fonction de la pile d'appels, un code correctement construit le transmettra si nécessaire. Accédez au empilez et appliquez les modifications nécessaires en cours de route :
func Execute() { DoThing(context.Background()) // Other stuff } func DoThing(pctx context.Context) { ctx, cancel := context.WithTimeout(pctx, 10 * time.Second) // Timeout after 10 seconds defer cancel() DoThingThatMayTakeAWhile(ctx) select { // You may want other stuff here case <-ctx.Done(): // Context timed out, maybe log an error? } } func DoThingThatMayTakeAWhile(pctx context.Context) { DoThingNeedingInfoInContext(context.WithValue(pctx, "thisisakey", "value")) } func DoThingNeedingInfoInContext(ctx context.Context) { val := ctx.Value("thisisakey") // Do something with val, check that it isn't nil, etc. }
Si je veux appeler dothingthatmaytakeawhile()
,我想为每个调用提供一个单独的子上下文 - 我不希望与每个调用共享 ctx
plusieurs fois. p>
Donc, dans votre code, chaque appel à mongo.connect()
都应该收到一个新创建的 context.context
instance.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!