Você está desenvolvendo um bot de linha de comando que interage com a API do Instagram usando OAuth, que não é otimizado para linha de comando aplicações. Para superar isso, você configurou um servidor HTTP local como URI de redirecionamento para autorização. Depois que o usuário autoriza o aplicativo e é redirecionado para o servidor, você deseja encerrar o servidor assim que o token de acesso for exibido.
Você encontrou um problema ao implementar o mecanismo de desligamento. Especificamente, chamar srv.Shutdown(nil) no manipulador de solicitação (showTokenToUser) leva a um erro:
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
O problema surge porque você estão chamando srv.Shutdown(nil) várias vezes:
Chamar srv.Shutdown enquanto o servidor ainda está escutando conexões leva a uma condição de corrida. A goroutine ListenAndServe() tenta fechar os listeners abertos e as conexões inativas, mas é interrompida pela chamada subsequente para Shutdown no fechamento do manipulador. Essa inconsistência de estado desencadeia o pânico.
Para resolver esse problema, você pode usar um dos dois métodos:
1. Use context.WithCancel:
Nesta abordagem, você cria um context.Context com uma função de cancelamento. O contexto é passado para a goroutine ListenAndServe e para a função manipuladora showTokenToUser. Dentro do manipulador, quando o token de acesso for exibido ao usuário, você chama a função cancel para encerrar o contexto. A goroutine ListenAndServe desligará normalmente o servidor quando o contexto for cancelado.
2. Use o mesmo Context:
Em vez de chamar context.WithCancel, você pode passar o mesmo context.Context para a goroutine ListenAndServe e a função manipuladora. Quando o token de acesso é exibido, você chama cancel() no contexto, o que acionará o desligamento do manipulador e da goroutine ListenAndServe.
Após implementar qualquer abordagem, lembre-se de aguardar a função srv.Shutdown para ser concluído antes de sair do programa.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3