ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° net/http Handler. (ΠΠΎΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ https://alexpts.github.io/go-next-docs/ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ Ρ net/http Π²ΠΌΠ΅ΡΡΠΎ fastHttp)
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² (ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ
priority: int). - ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° RegExp Π² ΠΏΡΡΡΡ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠΏΠΈΡΠ°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ uri 1 ΠΏΡΠ°Π²ΠΈΠ»ΠΎΠΌ).
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π·Π°Ρ Π²Π°ΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈΠ· ΠΏΡΡΠΈ ΠΌΠ°ΡΡΡΡΡΠ°.
- ΠΠ°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π½Π° Π»ΡΠ±ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈΠ· ΠΏΡΡΠΈ ΠΌΠ°ΡΡΡΡΡΠ° ΡΠ΅ΡΠ΅Π· regexp.
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΏΠΎ ΠΏΡΡΠΈ, HTTP ΠΌΠ΅ΡΠΎΠ΄Ρ, regexp, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ ΠΈ Ρ.Π΄.
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΉ resolver Π΄Π»Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ ΡΠ»ΠΎΠ΅Π² ΡΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ.
ΠΠ΅Π³Π΅Π½Π΄Π°:
h - http.Handler
m - http.ServeMux
app - go-mux-runner/mux/MicroApp
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ middleware Ρ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ (ΠΎΠ±Π΅ΡΡΠΊΠ°ΠΌΠΈ). ΠΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π½Π°ΡΠΈΠ²Π½Π°Ρ ΡΠ΅ΠΏΠΎΡΠΊΠ° ΠΈΠ· middleware http.Handler:
h(h) -> (h(h)) -> h(h)
http Mux ΡΠ΅ΡΠ²Π΅Ρ, ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΏΠΎ ΠΏΡΡΡΠΌ (1 ΠΏΡΡΡ - 1 ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ), Π½ΠΎ ΡΠ΅ΠΏΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π½ΡΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ ΠΊΠ°ΠΊ Π² ΠΏΡΠ½ΠΊΡΠ΅ 1:
mux(h) -> (h(h)) -> h(h)
go-mux-http ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Ρ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΠΌΠΈΡΡ ΠΏΡΡΡΠΌΠΈ (Π»ΠΈΠ±ΠΎ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΏΠΎ regexp ΡΠ°Π·Π½ΡΠ΅ ΠΏΡΡΠΈ Π² 1 ΠΏΡΠ°Π²ΠΈΠ»ΠΎ), ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠΎΠΈΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠ΅ΠΏΠΎΡΠΊΠΈ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ². ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π² 1 ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΎΠ±Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΠΈ ΡΠΎΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ. ΠΠΎΠΆΠ½ΠΎ Π³ΠΈΠ±ΠΊΠΎ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ· http.Handler ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π² mux_runner, ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΠΈΠ· mux_runner Π² http.Handler (Π²ΡΠ΅ ΠΎΡΠ΅Π½Ρ Π³ΠΈΠ±ΠΊΠΎ).
app(h) -> app(h) -> app(h) - Π²ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΎΠΏΠΈΡΠ°Π½Ρ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ go-mux-runner, ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π»Ρ Π½ΠΎΠ²ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ;
app(h) -> h(h) -> h(h) - ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ· ΠΏΡΠ½ΠΊΡΠ° 1 Π½Π°ΡΠΈΠ²Π½ΡΠ΅ ΡΠ΅ΠΏΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² (ΠΌΠ΅Π½Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎ);
h(h) -> h(h) -> h(app) -> app(h) - ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² mux_runner Π½Π° Π»ΡΠ±ΠΎΠΌ ΡΡΠ°ΠΏΠ΅;
app(h) -> app(h) -> h(h) -> h(h) - ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· mux_runner Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² http.Handle ΡΠ΅ΠΏΠΎΡΠΊΡ Π½Π° Π»ΡΠ±ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ (ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ);
Q: ΠΠ°ΠΊ Π² handler ΡΠ»ΠΎΡ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠΆΠ΅ ΠΎΠ±Π΅ΡΠ½ΡΡΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ?
A: Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π½Π΅ ΠΎΠ±Π΅ΡΠ½ΡΡΡΠΉ http.Handler ΠΏΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π½ΠΈΡΠ΅ΠΌ Π½Π΅ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΌ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±Π΅ΡΠ½ΡΡΡΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ (Π½Π°ΡΠΈΠ²Π½ΠΎ).
A: ΠΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π² ΡΠ»ΠΎΠΉ Π² Π²ΠΈΠ΄Π΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ΅ ΠΏΡΠ΅ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΠ½ΠΎΠ²Π° app.ServerHTTP(w, r) Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π΄Π°Π»ΡΡΠ΅ ΠΏΠΎ ΡΠ»ΠΎΡΠΌ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ.
A: ΠΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π΄ΡΡΠ³ΠΎΠΉ mux