Прохожу тут начала взаимоотношений http-сервера и базы данных. Но внезапно споткнулся не на БД - тут всё понятно.
Вот есть у меня такие две структуры-заготовки
type Book struct {
isbn string
title string
author string
price float32
}
var Books struct {
Items []*Book
}
и соответствующая таблица в БД (PostgresQL, но это не важно) с тремя строчками
Делаю запрос и забираю результат:
for rows.Next() {
bk := new(Book)
err := rows.Scan(&bk.isbn, &bk.title, &bk.author, &bk.price)
if err != nil {
http.Error(w, http.StatusText(500), 500)
return
}
Books.Items = append(Books.Items, bk)
}
Теперь если я отдам результат в ответ сервера вот так в цикле
for _, b := range Books.Items {
fmt.Fprintf(w, "%s, %s, %s, £%.2f\n", b.isbn, b.title, b.author, b.price)
}
то всё нормально.
Но я хочу, допустим, вывести эти строки в шаблоне, а ещё дописать там простую форму и попробовать добавлять из неё в базу. Но сначала - вывести на страницу что есть. Казалось бы, надо только перенести цикл в шаблон.
Пишу тут же в файле такую строку
var str = `<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Books</title>
</head>
<body>
{{ range .Items }}<div><b>{{ .isbn }}</b> {{ .title }} {{ .author }} {{ .price }}</div>
{{else}}<div><strong>no rows</strong></div>
{{end}}
</body>
</html>
`
И заменяю в коде цикл на вот это
html, err := template.New("books").Parse(str)
if err != nil {
fmt.Println(err)
}
html.Execute(w, Books)
и ничего не работает.
Объясните, плиз, что не так?
Ошибок никаких не выдаёт, а данные в шаблон не вставляются. Исходный код страницы в результате вот такой
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Books</title>
</head>
<body>
<div><b>
и на этом исполнение (Execute) просто останавливается.
Вот, не знаю уже, на что смотреть.