Anda sedang membangunkan bot baris arahan yang berinteraksi dengan API Instagram menggunakan OAuth, yang tidak dioptimumkan untuk baris arahan aplikasi. Untuk mengatasinya, anda telah menyediakan pelayan HTTP tempatan sebagai URI ubah hala untuk kebenaran. Selepas pengguna membenarkan aplikasi dan diubah hala ke pelayan, anda ingin menutup pelayan sebaik sahaja token akses telah dipaparkan.
Anda telah menghadapi masalah semasa melaksanakan mekanisme penutupan. Khususnya, memanggil srv.Shutdown(nil) dalam pengendali permintaan (showTokenToUser) membawa kepada ralat:
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
Isu timbul kerana anda memanggil srv.Shutdown(nil) beberapa kali:
Memanggil srv.Penutupan semasa pelayan masih mendengar sambungan membawa kepada keadaan perlumbaan. ListenAndServe() goroutine cuba untuk menutup pendengar terbuka dan sambungan melahu, tetapi ia terganggu oleh panggilan berikutnya kepada Shutdown dalam penutupan pengendali. Keadaan tidak konsisten ini mencetuskan panik.
Untuk menyelesaikan isu ini, anda boleh menggunakan salah satu daripada dua kaedah:
1. Gunakan context.WithCancel:
Dalam pendekatan ini, anda mencipta konteks.Konteks dengan fungsi batal. Konteks dihantar ke goroutine ListenAndServe dan fungsi pengendali showTokenToUser. Di dalam pengendali, apabila token akses telah dipaparkan kepada pengguna, anda memanggil fungsi batal untuk menamatkan konteks. Gorutin ListenAndServe akan menutup pelayan dengan anggun apabila konteksnya dibatalkan.
2. Gunakan Konteks yang sama:
Daripada memanggil konteks.DenganBatal, anda boleh menghantar konteks yang sama.Konteks kepada goroutine ListenAndServe dan fungsi pengendali. Apabila token akses dipaparkan, anda memanggil cancel() pada konteks, yang akan mencetuskan penutupan kedua-dua pengendali dan goroutine ListenAndServe.
Selepas melaksanakan mana-mana pendekatan, ingat untuk menunggu fungsi srv.Shutdown untuk diselesaikan sebelum keluar dari program.
Atas ialah kandungan terperinci Bagaimana untuk Mematikan Pelayan HTTP dengan Anggun Selepas Mengembalikan Respons?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!