На прошлой неделе я занимался разработкой небольшого веб-приложения на 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"
Разработчик: java, kotlin, c#, javascript, dart, 1C, python, php.
Пишите: @ighar. Buy me a coffee, please :).