Update ru/03.4.md
This commit is contained in:
20
ru/03.4.md
20
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)
|
||||
|
||||
Reference in New Issue
Block a user