Vous développez un robot en ligne de commande qui interagit avec l'API Instagram à l'aide d'OAuth, qui n'est pas optimisé pour la ligne de commande candidatures. Pour surmonter ce problème, vous avez configuré un serveur HTTP local comme URI de redirection pour l'autorisation. Une fois que l'utilisateur a autorisé l'application et est redirigé vers le serveur, vous souhaitez arrêter le serveur une fois le jeton d'accès affiché.
Vous avez rencontré un problème lors de la mise en œuvre du mécanisme d'arrêt. Plus précisément, l'appel de srv.Shutdown(nil) dans le gestionnaire de requêtes (showTokenToUser) entraîne une erreur :
2017/11/23 16:02:03 Httpserver: ListenAndServe() error: http: Server closed 2017/11/23 16:02:03 http: panic serving [::1]:61793: runtime error: invalid memory address or nil pointer dereference
Le problème se pose parce que vous appellent srv.Shutdown(nil) plusieurs fois :
Appeler srv.Shutdown alors que le serveur est toujours à l'écoute des connexions entraîne une condition de concurrence critique. La goroutine ListenAndServe() tente de fermer les écouteurs ouverts et les connexions inactives, mais elle est interrompue par l'appel ultérieur à Shutdown lors de la fermeture du gestionnaire. Cette incohérence d'état déclenche la panique.
Pour résoudre ce problème, vous pouvez utiliser l'une des deux méthodes suivantes :
1. Utilisez context.WithCancel :
Dans cette approche, vous créez un context.Context avec une fonction d'annulation. Le contexte est transmis à la goroutine ListenAndServe et à la fonction de gestionnaire showTokenToUser. À l'intérieur du gestionnaire, lorsque le jeton d'accès a été affiché à l'utilisateur, vous appelez la fonction d'annulation pour mettre fin au contexte. La goroutine ListenAndServe arrêtera progressivement le serveur lorsque le contexte sera annulé.
2. Utilisez le même Context:
Au lieu d'appeler context.WithCancel, vous pouvez transmettre le même context.Context à la goroutine ListenAndServe et à la fonction de gestionnaire. Lorsque le jeton d'accès est affiché, vous appelez Cancel() sur le contexte, ce qui déclenchera l'arrêt du gestionnaire et de la goroutine ListenAndServe.
Après avoir implémenté l'une ou l'autre approche, n'oubliez pas d'attendre la fonction srv.Shutdown à terminer avant de quitter le programme.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3