Вы разрабатываете бота командной строки, который взаимодействует с API Instagram с использованием OAuth, который не оптимизирован для командной строки приложения. Чтобы преодолеть эту проблему, вы настроили локальный HTTP-сервер в качестве URI перенаправления для авторизации. После того как пользователь авторизует приложение и будет перенаправлен на сервер, вы захотите выключить сервер после отображения токена доступа.
Вы столкнулись с проблемой при реализации механизма завершения работы. В частности, вызов srv.Shutdown(nil) в обработчике запроса (showTokenToUser) приводит к ошибке:
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
Проблема возникает из-за того, что вы вызывают srv.Shutdown(nil) несколько раз:
Вызов srv.Shutdown, когда сервер все еще прослушивает соединения, приводит к состоянию гонки. Горутина ListenAndServe() пытается закрыть открытые прослушиватели и простаивающие соединения, но она прерывается последующим вызовом Shutdown при закрытии обработчика. Такое несоответствие состояний вызывает панику.
Чтобы решить эту проблему, вы можете использовать один из двух методов:
1. Используйте context.WithCancel:
При таком подходе вы создаете context.Context с функцией отмены. Контекст передается горутине ListenAndServe и функции-обработчику showTokenToUser. Внутри обработчика, когда токен доступа отображается пользователю, вы вызываете функцию отмены, чтобы завершить контекст. Горутина ListenAndServe корректно завершит работу сервера при отмене контекста.
2. Используйте тот же контекст:
Вместо вызова context.WithCancel вы можете передать тот же context.Context горутине ListenAndServe и функции-обработчику. Когда токен доступа отображается, вы вызываете метод cancel() в контексте, что вызывает завершение работы как обработчика, так и горутины ListenAndServe.
После реализации любого подхода не забудьте дождаться функции srv.Shutdown. завершить перед выходом из программы.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3