revision and correction of all chapter 3
This commit is contained in:
30
es/03.4.md
30
es/03.4.md
@@ -4,7 +4,7 @@ En las secciones anteriores, hemos aprendido sobre el flujo de trabajo de la web
|
||||
|
||||
## goroutine en Conn
|
||||
|
||||
A diferencia de los servidores HTTP normales , Go utiliza goroutine para toda conexion que creó Conn con el fin de lograr una alta concurrencia y rendimiento, por lo que cada caso es independiente.
|
||||
A diferencia de los servidores HTTP normales, Go utiliza goroutine para toda trabajo inicializado por Conn con el fin de lograr una alta concurrencia y rendimiento, por lo que cada trabajo es independiente.
|
||||
|
||||
Go usa el siguiente código para esperar a nuevas conexiones de clientes .
|
||||
```
|
||||
@@ -14,11 +14,11 @@ Go usa el siguiente código para esperar a nuevas conexiones de clientes .
|
||||
}
|
||||
go c.serve()
|
||||
```
|
||||
Como puede ver, se crea una goroutine para cada conexión , y se pasa el controlador que es capaz de leer los datos de solicitud a la goroutine .
|
||||
Como puedes ver, se crea una goroutine para cada conexión , y se pasa el controlador que es capaz de leer los datos de solicitud a la goroutine.
|
||||
|
||||
## ServeMux personalizado
|
||||
|
||||
Utilizamos el enrutamiento por defecto en la sección anterior, cuando se habla conn.server , el router pasa los datos de solicitud como back-end al controlador.
|
||||
Utilizamos el enrutamiento por defecto en la sección anterior, cuando hablamos de conn.server, el router pasa los datos de solicitud como back-end al controlador.
|
||||
|
||||
El struct del router por defecto:
|
||||
```
|
||||
@@ -40,7 +40,7 @@ La interfaz de Handler:
|
||||
ServeHTTP(ResponseWriter, *Request) // routing implementer
|
||||
}
|
||||
```
|
||||
`Handler` es una interfaz, pero la función `sayhelloName` no implementar su interfaz , por eso podríamos agregarlo como controlador ? Debido a que hay otro tipo `HandlerFunc` en el paquete `http` . Llamamos `HandlerFunc` definir nuestra `sayhelloName` , así `sayhelloName` implementa el `Handler` al mismo tiempo. que es como llamamos `HandlerFunc(f)`, y la función `f` es forzado convertido al tipo `HandlerFunc`.
|
||||
`Handler` es una interfaz, pero la función `sayhelloName` no implementa su interfaz, entonces ¿cómo podríamos agregarla como controlador? Debido a que hay otro tipo `HandlerFunc` en el paquete `http`. Nosotros llamamos `HandlerFunc` para definir nuestro método `sayhelloName` , así `sayhelloName` implementa el `Handler` al mismo tiempo. Es como si llamaramos `HandlerFunc(f)`, y la función `f` es forzado a convertirce al tipo `HandlerFunc`.
|
||||
```
|
||||
type HandlerFunc func(ResponseWriter, *Request)
|
||||
|
||||
@@ -49,7 +49,7 @@ La interfaz de Handler:
|
||||
f(w, r)
|
||||
}
|
||||
```
|
||||
Cómo enrutador llama los controladores después de establecer reglas del router ?
|
||||
¿Cómo enrutador llama los controladores después de establecer reglas del router?
|
||||
|
||||
El enrutador llama `mux.handler.ServeHTTP(w , r)` cuando recibe solicitudes. En otras palabras, se llama la interfaz `ServeHTTP` de los controladores.
|
||||
|
||||
@@ -70,9 +70,9 @@ Ahora, vamos a ver cómo funciona `mux.handler`.
|
||||
return h
|
||||
}
|
||||
```
|
||||
El router utiliza la URL como clave para encontrar correspondiente controlador que guarda en un mapa , y llama handler.ServeHTTP para ejecutar funciones para manejar los datos.
|
||||
El enrutador utiliza la URL como llave para encontrar el controlador correspondiente que guarda en un mapa, luego llama handler.ServeHTTP para ejecutar funciones y manejar los datos.
|
||||
|
||||
Usted debe entender el flujo de trabajo del router, y Go realmente apoya routers personalizados. El segundo argumento de ListenAndServe es para la configuración del router a medida, que es una interfaz de `Handler`. Por lo tanto , se puede utilizar cualquier router que implemente la interfaz `Handler`.
|
||||
En este punto, debes entender el flujo de trabajo del enrutador, y Go realmente apoya routers personalizados. El segundo argumento de ListenAndServe es para la configuración del enrutadores a la medida, entonces cualquier enrutador que implemente la interfaz de `Handler` puede ser utilizado.
|
||||
|
||||
El siguiente ejemplo muestra cómo implementar un enrutador sencillo.
|
||||
```
|
||||
@@ -106,7 +106,7 @@ El siguiente ejemplo muestra cómo implementar un enrutador sencillo.
|
||||
```
|
||||
# Enrutamiento
|
||||
|
||||
Si tu no quieres usar un router, todavía puedes lograr lo que escribimos en la sección de arriba reemplazando el segundo argumento de `ListenAndServe` a nil, y registrando las URLS usando un `HandleFunc` función que recorre todas las URLs registradas para encontrar la mejor coincidencia, entonces debemos preocuparnos por el orden de registro.
|
||||
Si no quieres usar un enrutador, todavía puedes lograr lo que escribimos en la sección de arriba reemplazando el segundo argumento de `ListenAndServe` a nil, y registrando las URLS usando un `HandleFunc` función que recorre todas las URLs registradas para encontrar la mejor coincidencia, entonces debemos preocuparnos por el orden de registro.
|
||||
|
||||
código de ejemplo:
|
||||
```
|
||||
@@ -131,7 +131,7 @@ código de ejemplo:
|
||||
}
|
||||
}
|
||||
```
|
||||
Esto está bien para aplicaciones simples las cuales no necesitan ruteos parametriados, pero ¿cuándo necesitas eso? Puedes usar las herramientas o frameworks, pero como este libro está enfocado en crear aplicaciones web en Go, vamos a enseñarte como manejar ese escenario también.
|
||||
Esto está bien para aplicaciones simples las cuales no necesitan ruteos parametrizados, pero ¿cuándo necesitas eso? Puedes usar las herramientas o frameworks, pero como este libro está enfocado en crear aplicaciones web en Go, vamos a enseñarte como manejar ese escenario también.
|
||||
|
||||
Cuando la concidencia es hecha, se llama a la función definida en `HandleFunc`, así que supongamos que estamos escribiendo un manejador para una lista y queremos eliminar una tarea, así que la aplicación decide que función se va a llamar cuando llegue la petición `/delete/1`, entonces registramos la URL de la siguiente manera:
|
||||
`http.HandleFunc("/delete/", views.DeleteTaskFunc)`
|
||||
@@ -172,16 +172,16 @@ Cuando la concidencia es hecha, se llama a la función definida en `HandleFunc`,
|
||||
En escenarios mas complejos también podemos utilizar este método, la ventaja es que no vamos a tener que usar herramientas de terceros, pero las herramientas de terceros tienden a ser útiles en su sentido propio. Tienes que tomar la decisión de cuál método prefieres. Ninguna respuesta es la respuesta correcta.
|
||||
|
||||
|
||||
## GO flujo de ejecución del código
|
||||
## Flujo de ejecución del código en GO
|
||||
|
||||
Vamos a echar un vistazo a la lista de flujo de ejecución en conjunto.
|
||||
|
||||
- Se llama http.HandleFunc
|
||||
1. Llame HandleFunc de DefaultServeMux
|
||||
2. Llame Handle de DefaultServeMux
|
||||
3. Agregar reglas del router para mapear [cadena ] muxEntry de DefaultServeMux
|
||||
- Se llama http.ListenAndServe (": 9090 " , nil )
|
||||
1. se instancia el servidor
|
||||
1. Se Llama HandleFunc de DefaultServeMux
|
||||
2. Se Llama Handle de DefaultServeMux
|
||||
3. Se agregan las reglas del enrutamiento a map[string]muxEntry de DefaultServeMux
|
||||
- Se llama http.ListenAndServe (":9090" , nil )
|
||||
1. Se instancia el servidor
|
||||
2. Llama ListenAndServe del Servidor
|
||||
3. Llama net.Listen ( " tcp" , addr ) para escuchar en el puerto .
|
||||
4. Iniciar un bucle, y aceptar las solicitudes en el cuerpo del bucle.
|
||||
|
||||
Reference in New Issue
Block a user