Шаблоны в 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})
	})

<ul>
  {{ range .values }}
  <li>{{ . }}</li>
  {{ end }}
</ul>

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

$ curl http://localhost:9090/array
<ul>
  <li>0</li>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
</ul>

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

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})
	})

<ul>
  {{ range .values }}
  <li>{{ .Value1 }} -> {{ .Value2 }}</li>
  {{ end }}
</ul>

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

$ curl http://localhost:9090/arrayStruct
<ul>
  <li>0 -> value 0</li>
  <li>1 -> value 1</li>
  <li>2 -> value 2</li>
  <li>3 -> value 3</li>
  <li>4 -> value 4</li>  
</ul>

Карты

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

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})
	})

<ul>
  {{ range .myMap }}
  <li>{{ . }}</li>
  {{ end }}
</ul>

заcURL-им:

$ curl http://localhost:9090/map
<ul>
  <li>Go</li>
  <li>1.7.4</li>
</ul>

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

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})
	})

<ul>
  {{ range $key, $value := .myMap }}
  <li>{{ $key }} -> {{ $value }}</li>
  {{ end }}
</ul>

$ curl http://localhost:9090/mapKeys
<ul>  
  <li>language -> Go</li>  
  <li>version -> 1.7.4</li>  
</ul>

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

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})
	})

<ul>
  <li>Language: {{ .myMap.language }}</li>
  <li>Version: {{ .myMap.version }}</li>
</ul>

$ curl http://localhost:9090/mapSelectKeys
<ul>
  <li>Language: Go</li>
  <li>Version: 1.7.4</li>
</ul>

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

По материалам: «Go: Templating with the Gin Web Framework»
1 комментарий
VitalyDodonov
Спасибо за линк на шаблоны в Hugo
из поиска туда заглядывал, не увидел решения своих проблем, но второму разу зашёл и разобрался.
Последний раз редактировалось
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.