Шаблоны в Gin Web Framework (Golang)

Шаблоны в Gin Web Framework (Golang)
На прошлой неделе я занимался разработкой небольшого веб-приложения на Go с фреймворком Gin и у меня заняло порядочно времени на то, чтобы разобраться с языком шаблонов, используемых в нём. В этой небольшой заметке я разберу несколько примеров работы с шаблонами в Go, которые должны помочь вам в их понимании.

Перед тем, как начать, приведу настройки моего GOPATH:

$ echo $GOPATH
/Users/markneedham/projects/gocode

Проект с этими примерами располагается в папке src:

$ pwd
/Users/markneedham/projects/gocode/src/github.com/mneedham/golang-gin-templating-demo

Вначале установим Gin:

$ go get gopkg.in/gin-gonic/gin.v1
Он установится сюда:

$ ls -lh $GOPATH/src/gopkg.in
total 0
drwxr-xr-x 3 markneedham staff 102B 23 Dec 10:55 gin-gonic

Теперь создадим главную функцию для запуска нашего веб-приложения.

demo.go:
package main

import (
"github.com/gin-gonic/gin"
"net/http"
)

func main() {
router := gin.Default()
router.LoadHTMLGlob("templates/*")

// our handlers will go here

router.Run("0.0.0.0:9090")
}

Мы запустили приложение на порту 9090, а шаблоны приложения располагаются в папке templates, которая находится там же:

$ ls -lh
total 8
-rw-r--r-- 1 markneedham staff 570B 23 Dec 13:34 demo.go
drwxr-xr-x 4 markneedham staff 136B 23 Dec 13:34 templates

Массивы

Создадим роут, выводящий значения неупорядоченного массива:

router.GET("/array", func(c *gin.Context) {
var values []int
for i := 0; i < 5; i++ { values = append(values, i) } c.HTML(http.StatusOK, "array.tmpl", gin.H{"values": values}) })

    {{ range .values }}

  • {{ . }}
  • {{ end }}


Запросим с cURL ответ от приложения и должны увидеть следующее:

$ curl http://localhost:9090/array

  • 0
  • 1
  • 2
  • 3
  • 4


А что если нам нужно вывести массив структур:

import "strconv"

type Foo struct {
value1 int
value2 string
}

router.GET("/arrayStruct", func(c *gin.Context) {
var values []Foo
for i := 0; i < 5; i++ { values = append(values, Foo{Value1: i, Value2: "value " + strconv.Itoa(i)}) } c.HTML(http.StatusOK, "arrayStruct.tmpl", gin.H{"values": values}) })

    {{ range .values }}

  • {{ .Value1 }} -> {{ .Value2 }}
  • {{ end }}


Запросим ответ с cURL:

$ curl http://localhost:9090/arrayStruct

  • 0 -> value 0
  • 1 -> value 1
  • 2 -> value 2
  • 3 -> value 3
  • 4 -> value 4

Карты

Сделаем то же самое с картами:

router.GET("/map", func(c *gin.Context) {
values := make(map[string]string)
values["language"] = "Go"
values["version"] = "1.7.4"

c.HTML(http.StatusOK, "map.tmpl", gin.H{"myMap": values})
})

    {{ range .myMap }}

  • {{ . }}
  • {{ end }}


заcURL-им:

$ curl http://localhost:9090/map

  • Go
  • 1.7.4


А что если нам нужно увидеть ключи?

router.GET("/mapKeys", func(c *gin.Context) {
values := make(map[string]string)
values["language"] = "Go"
values["version"] = "1.7.4"

c.HTML(http.StatusOK, "mapKeys.tmpl", gin.H{"myMap": values})
})

    {{ range $key, $value := .myMap }}

  • {{ $key }} -> {{ $value }}
  • {{ end }}


$ curl http://localhost:9090/mapKeys

  • language -> Go
  • version -> 1.7.4


И, наконец, что если нам нужно выбрать определённые значения из карты?

router.GET("/mapSelectKeys", func(c *gin.Context) {
values := make(map[string]string)
values["language"] = "Go"
values["version"] = "1.7.4"

c.HTML(http.StatusOK, "mapSelectKeys.tmpl", gin.H{"myMap": values})
})

  • Language: {{ .myMap.language }}
  • Version: {{ .myMap.version }}


$ curl http://localhost:9090/mapSelectKeys

  • Language: Go
  • Version: 1.7.4


Также мне понравился материал о шаблонах в Hugo, обязательно прочитайте его. Весь код с этими примерами можно взять здесь. Удачи!

По материалам: "Go: Templating with the Gin Web Framework"

Leave a Comment