Golang中双引号的使用技巧与常见问题

Golang中双引号的使用技巧与常见问题 在Go HTML模板中,一行代码看起来像这样:

<li id="{{.menu_id}}" onclick={{.menu_id}}>

无论我添加还是省略双引号。

在浏览器检查器中,它看起来像这样:

onclick=""home""

它应该看起来像这样:

onclick="home()"

或者在源代码中:

<li id="home" onclick=&#34;home&#34;>

我该如何去掉多余的双引号?

我找到了“解决方案”——抱歉

onclick="content({{.menu_id}})"

更多关于Golang中双引号的使用技巧与常见问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中双引号的使用技巧与常见问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go HTML模板中,双引号处理不当会导致渲染问题。你遇到的问题是模板引擎对属性值的自动转义和引号嵌套造成的。

问题分析

当模板渲染为:

<li id="{{.menu_id}}" onclick={{.menu_id}}>

如果.menu_id的值是"home",渲染结果会是:

<li id="home" onclick=""home"">

这是因为模板引擎将{{.menu_id}}中的双引号直接插入到属性值中。

正确解决方案

方案1:使用html/template的自动上下文感知转义

// 在模板中正确写法
<li id="{{.menu_id}}" onclick="{{.menu_id}}()">

方案2:使用JavaScript字符串字面量

// 如果menu_id是函数名
<li id="{{.menu_id}}" onclick="{{.menu_id}}()">

方案3:使用template.HTML类型避免转义(谨慎使用)

// 在Go代码中
type MenuData struct {
    MenuID template.HTML
}

data := MenuData{
    MenuID: template.HTML("home()"),
}

// 在模板中
<li onclick="{{.MenuID}}">

方案4:完整的HTML属性写法

// 确保属性值被正确引用
<li id="{{.menu_id}}" onclick="{{.menu_id}}()">

示例代码

package main

import (
    "html/template"
    "os"
)

func main() {
    tmpl := `<!DOCTYPE html>
<html>
<body>
    <!-- 正确写法 -->
    <li id="{{.ID}}" onclick="{{.Handler}}">{{.Name}}</li>
    
    <!-- 动态生成函数调用 -->
    <li id="{{.ID}}" onclick="{{.FuncName}}('{{.Param}}')">{{.Name}}</li>
</body>
</html>`

    data := struct {
        ID       string
        Name     string
        Handler  string
        FuncName string
        Param    string
    }{
        ID:       "home",
        Name:     "首页",
        Handler:  "home()",
        FuncName: "navigate",
        Param:    "dashboard",
    }

    t := template.Must(template.New("page").Parse(tmpl))
    t.Execute(os.Stdout, data)
}

输出结果:

<li id="home" onclick="home()">首页</li>
<li id="home" onclick="navigate('dashboard')">首页</li>

关键点

  1. 始终用双引号包裹HTML属性值
  2. html/template包处理转义,不要手动添加引号
  3. 如果.menu_id包含函数调用,直接在模板中写完整:{{.menu_id}}()
  4. 避免在数据中嵌入HTML引号,让模板引擎处理引号转义

你的"解决方案"onclick="content({{.menu_id}})"之所以有效,是因为它将.menu_id作为参数传递给content()函数,而不是直接作为属性值,这避免了引号嵌套问题。

回到顶部