Вы можете вставить Javascript-код в HTML-страницу (например, в разделе <head>
), где вы создаете переменные Javascript и инициализируете их параметрами, переданными при выполнении шаблона.
Смотрите этот пример:
func main() {
t := template.Must(template.New("").Parse(templ))
m := map[string]interface{}{
"title": "Test page",
"username": "bob",
"counter": 12,
}
if err := t.Execute(os.Stdout, m); err != nil {
panic(err)
}
}
const templ = `<html><head>
<script>
var _title = {{.title}};
var _username = {{.username}};
var _counter = {{.counter}};
</script>
</head><body>
</body>
</html>`
Это приводит к HTML-документа (попробуйте его на Go Playground):
<html><head>
<script>
var _title = "Test page";
var _username = "bob";
var _counter = 12 ;
</script>
</head><body>
</body>
</html>
Что это означает, что другие Javascript код на странице (или встраиваемыми или ссылочный, внешний) будут видеть переменные _title
, _username
, _counter
и использовать их как обычные переменные, и они инициализируются значениями, которые мы передали Template.Execute()
.
Обратите внимание, что пакет html/template
выполняет контекстное экранирование. Посмотрите, что он вставил результат {{.title}}
в кавычки, потому что это string
, и вот как это должно быть написано в коде Javascript, но при добавлении результата {{.counter}}
кавычек не было добавлено, потому что это значение типа int
.
Также обратите внимание, что вы должны использовать уникальную стратегию именования, чтобы избежать столкновения с существующими переменными или переменными, которые могут использоваться в другом коде Javascript. Обычно используется специальный префикс (или постфикс).
Также проверьте этот родственный вопрос: Referencing Go array in Javascript
мы действительно должны использовать Template.Execute(). Не можем ли мы передать переменные так, как я использовал c.HTML? Я могу получить доступ к этим переменным как '{{.username}}'. Разве я не могу хранить их как глобальные переменные, как вы? – aaj
@ love2code Вам не нужно использовать это, вы можете просто передать их с помощью 'c.HTML()'. Я использовал 'Template.Execute()' так, чтобы он работал на Go Playground, потому что пакет 'github.com/gin-gonic/gin' не может быть импортирован там. Принцип создания и инициализации переменных Javascript - это то, что важно, остальное - это просто, чтобы он мог работать на игровой площадке Go. – icza