Maison >développement back-end >Golang >Application Golang cli - comment utiliser correctement le contexte ?

Application Golang cli - comment utiliser correctement le contexte ?

WBOY
WBOYavant
2024-02-09 10:42:20965parcourir

Golang cli 应用程序 - 如何正确使用上下文?

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 !

Contenu de la question

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

Solution de contournement

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:Golang plusieurs jsonArticle suivant:Golang plusieurs json