From 52b3f215b0480eb2df11210437bbf2ad255381ae Mon Sep 17 00:00:00 2001 From: Ivan Porozhnyy Date: Sat, 3 Mar 2018 11:14:44 +0200 Subject: [PATCH] Update ru/03.4.md --- ru/03.4.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ru/03.4.md b/ru/03.4.md index 396f876a..28f281f1 100644 --- a/ru/03.4.md +++ b/ru/03.4.md @@ -4,7 +4,7 @@ ## Использование горутин в функции Conn -В отличии от обычных HTTP серверов, Go использует гоурутины при каждом обращении к функции Conn. За счет эго обеспечивается высокая производительность и параллельная обработка. +В отличии от обычных HTTP серверов, Go использует горутины при каждом обращении к функции Conn. За счет эго обеспечивается высокая производительность и параллельная обработка. Go использует следующий код для ожидания новых подключений от клиента: @@ -40,10 +40,10 @@ Go использует следующий код для ожидания нов ServeHTTP(ResponseWriter, *Request) // реализация маршрутизации } -`Handler` - это интерфейс, однако, функция `sayhelloName` не реализует этот интерфейс. Почему, в таком случае, мы смогли использовать ее в качестве обработчика? Потому, что в пакете `http` существует другой тип `HandlerFunc`. В нашем нашем сервере из раздела 3.2 при вызове `HandlerFunc` происходит автоматическое приведение нашей функции `sayhelloName` к интерфейсу `Handler`. Это равносильно вызову `HandlerFunc(f)`, при этом `f` будет принудительно приведена к типу `HandlerFunc`. +`Handler` - это интерфейс, однако, функция `sayhelloName` не реализует этот интерфейс. Почему, в таком случае, мы смогли использовать ее в качестве обработчика? Потому, что в пакете `http` существует другой тип `HandlerFunc`. В нашем сервере из раздела 3.2 при вызове `HandlerFunc` происходит автоматическое приведение нашей функции `sayhelloName` к интерфейсу `Handler`. Это равносильно вызову `HandlerFunc(f)`, при этом `f` будет принудительно приведена к типу `HandlerFunc`. type HandlerFunc func(ResponseWriter, *Request) - + // ServeHTTP вызывает f(w, r). func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { f(w, r) @@ -58,7 +58,7 @@ Go использует следующий код для ожидания нов func (mux *ServeMux) handler(r *Request) Handler { mux.mu.RLock() defer mux.mu.RUnlock() - + // Host-зависимый шаблон, имеет приоритет над универсальным h := mux.match(r.Host + r.URL.Path) if h == nil { @@ -72,20 +72,20 @@ Go использует следующий код для ожидания нов Маршрутизатор использует URL-адрес в качестве ключа для поиска соответствующего обработчика, который сохранен в карте и вызовов handler.ServeHTTP для выполнения функций обработки данных. -Теперь вы должны понимать принципы работы роутера. Фактически, Go поддерживает настраиваемые роутеры. Второй аргумент функции `ListenAndServe` необходим для конфигурации настраиваемого роутера с типом `Handler`. Таким образом любой роутер реализует интерфейс `Handler`. +Теперь вы должны понимать принципы работы роутера. Фактически, Go поддерживает настраиваемые роутеры. Второй аргумент функции `ListenAndServe` необходим для конфигурации настраиваемого роутера с типом `Handler`. Таким образом, любой роутер реализует интерфейс `Handler`. Следующий пример покажет, как реализовать простой роутер. package main - + import ( "fmt" "net/http" ) - + type MyMux struct { } - + func (p *MyMux) ServeHTTP(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/" { sayhelloName(w, r) @@ -94,11 +94,11 @@ Go использует следующий код для ожидания нов http.NotFound(w, r) return } - + func sayhelloName(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello myroute!") } - + func main() { mux := &MyMux{} http.ListenAndServe(":9090", mux)