Construyendo una web app con Go desde cero - Parte #2
Construyendo una web app con Go desde cero - Parte #2 #
En esta segunda parte:
- Extendemos
IndexHandlerpara que emitirhtmlen vez detext. - Aprendemos sobre el control de errores y la estructura de datos
map.
package main
import (
"log"
"net/http"
"text/template"
)
func IndexHandler(w http.ResponseWriter, r *http.Request) {
html := "<h1>{{.Title}}<h1/>"
t, err := template.New("index").Parse(html)
if err != nil {
log.Printf("failed to parse index template, error: %v", err)
return
}
data := map[string]string{
"Title": "Store App! :)",
}
if err := t.Execute(w, data); err != nil {
log.Printf("failed to execute index template, error: %v", err)
return
}
}
func main() {
log.Println("server running on :8080")
http.HandleFunc("/", IndexHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
Explicación: #
import (
"log"
"net/http"
"text/template"
)
Agregamos el paquete text/template de la biblioteca estándar de Go, usaremos
varias funciones de este paquete para que IndexHandler pueda emitir
html en vez de text.
html := "<h1>{{.Title}}<h1/>"
Declaramos e inicializamos la variable html, la cual tiene solo una etiqueta h1
y dentro una variable .Title que será reemplazada por un valor arbitrario que
definiremos luego.
También podemos declarar e inicializar la variable previa de las siguientes formas:
var html string = "<h1>{{.Title}}<h1/>"
var html string
html = "<h1>{{.Title}}<h1/>"
t, err := template.New("index").Parse(html)
Usamos la función New para crear un nuevo template llamado index y
Parse para convertir el string <h1>{{.Title}}<h1/> a una instancia del tipo Template.
t, err := template.New("index").Parse(html)
if err != nil {
log.Printf("failed to parse index template, error: %v", err)
return
}
El segundo valor que retorna Parse es del tipo error,
usamos la sentencia if para saber si contiene un valor,
si err es diferente de nil significa que algo falló y
debemos manejar u omitir el error.
Si deseamos omitir el error usamos
_:
t, _ := template.New(“index”).Parse(html)
Si existe un error, entonces usamos log.Printf para escribir
en la terminal el mensaje: failed to parse index template, error: %v
(falló cuando se intento analizar el template index, error: [aquí irá el mensaje de error]).
Usamos:
log.Printlnpara escribir en elstandard errorpor defecto.
log.Printfsimilar alog.Printlnmás la posibilidad de dar formato al string
y reemplazar variables por valores.
data := map[string]string{
"Title": "Store App! :)",
}
Usamos la estructura de datos del tipo map para crear una variable data
que contiene llaves y valores del tipo string.
if err := t.Execute(w, data); err != nil {
log.Printf("failed to execute index template, error: %v", err)
return
}
Usamos la función Execute para escribir en w http.ResponseWriter el
resultado de ejecutar el template t, usamos como contexto de la ejecución
la variable data, entonces {{.Title}} será reemplazado por Store App! :).
Es hora de ejecutar nuestro programa store
go run main.go
Terminal #
2015/11/21 19:07:11 server running on :8080
Seguidamente realizamos una petición web a nuestro servidor, para ello usamos el comando curl.
curl http://localhost:8080/
Terminal #
<h1>Store App! :)<h1/>
A continuación el link al código de esta segunda parte:
https://github.com/chris-ramon/go-workshop/blob/step-2/store/main.go