Templates 模板中带引号的字符串

Templates 模板中带引号的字符串,templates,go,Templates,Go,我想在我的html模板(实际上是JavaScript部分)中输入null或字符串,并发送电子邮件: var email = null; // or a string: var email = "somebody@somewhere.com"; 但是使用模板 var email = {{.Email}}; 每次我都会收到引用字符串: var email = "null"; var email = "somebody@somewhere.com"; 如何修复它 编辑:这是我的代码: 您可以看到

我想在我的html模板(实际上是JavaScript部分)中输入null或字符串,并发送电子邮件:

var email = null;
// or a string:
var email = "somebody@somewhere.com";
但是使用模板

var email = {{.Email}};
每次我都会收到引用字符串:

var email = "null";
var email = "somebody@somewhere.com";
如何修复它

编辑:这是我的代码:


您可以看到Go用引号包围字符串并删除注释-有预处理或后处理。

如果没有看到您的代码,我只能提供

如果让我猜一猜,我会说您传递的数据是字符串,而不是字符串指针。字符串的值不能为nil/null,只有字符串指针可以。虽然这会产生一个“”,而不是一个“null”,(),所以我只能想象这是你在代码中做的奇怪的事情

为了防止链接腐烂,我复制了下面的代码示例,尽管点击链接查看它们的输出是值得的

所需功能

package main

import (
    "log"
    "os"
    "html/template"
)

type TemplateData struct {
    Email *string
}

func main() {

    const temp = "<script>var email = {{.Email}};</script>\n"

    t := template.Must(template.New("email_template").Parse(temp))
    email := "somebody@somewhere.com"
    err := t.Execute(os.Stdout, TemplateData{
        Email: &email,
    })
    if err != nil {
        log.Println("executing template:", err)
    }
    err = t.Execute(os.Stdout, TemplateData{
        Email: nil,
    })
    if err != nil {
        log.Println("executing template:", err)
    }

}
package main

import (
    "log"
    "os"
    "html/template"
)

type TemplateData struct {
    Email string
}

func main() {

    const temp = "<script>var email = {{.Email}};</script>\n"

    t := template.Must(template.New("email_template").Parse(temp))
    email := "somebody@somewhere.com"
    err := t.Execute(os.Stdout, TemplateData{
        Email: email,
    })
    if err != nil {
        log.Println("executing template:", err)
    }
    err = t.Execute(os.Stdout, TemplateData{
    })
    if err != nil {
        log.Println("executing template:", err)
    }

}
主程序包
进口(
“日志”
“操作系统”
“html/模板”
)
类型TemplateData结构{
电子邮件*字符串
}
func main(){
const temp=“var email={{.email}};\n”
t:=template.Must(template.New(“email_template”).Parse(temp))
电子邮件:=”somebody@somewhere.com"
错误:=t.Execute(os.Stdout,TemplateData{
电子邮件:&电子邮件,
})
如果错误!=零{
Println(“正在执行的模板:”,错误)
}
err=t.Execute(os.Stdout,TemplateData{
电邮:无,
})
如果错误!=零{
Println(“正在执行的模板:”,错误)
}
}
尝试使用“null”字符串

package main

import (
    "log"
    "os"
    "html/template"
)

type TemplateData struct {
    Email *string
}

func main() {

    const temp = "<script>var email = {{.Email}};</script>\n"

    t := template.Must(template.New("email_template").Parse(temp))
    email := "somebody@somewhere.com"
    err := t.Execute(os.Stdout, TemplateData{
        Email: &email,
    })
    if err != nil {
        log.Println("executing template:", err)
    }
    err = t.Execute(os.Stdout, TemplateData{
        Email: nil,
    })
    if err != nil {
        log.Println("executing template:", err)
    }

}
package main

import (
    "log"
    "os"
    "html/template"
)

type TemplateData struct {
    Email string
}

func main() {

    const temp = "<script>var email = {{.Email}};</script>\n"

    t := template.Must(template.New("email_template").Parse(temp))
    email := "somebody@somewhere.com"
    err := t.Execute(os.Stdout, TemplateData{
        Email: email,
    })
    if err != nil {
        log.Println("executing template:", err)
    }
    err = t.Execute(os.Stdout, TemplateData{
    })
    if err != nil {
        log.Println("executing template:", err)
    }

}
主程序包
进口(
“日志”
“操作系统”
“html/模板”
)
类型TemplateData结构{
电子邮件字符串
}
func main(){
const temp=“var email={{.email}};\n”
t:=template.Must(template.New(“email_template”).Parse(temp))
电子邮件:=”somebody@somewhere.com"
错误:=t.Execute(os.Stdout,TemplateData{
电邮:电邮,,
})
如果错误!=零{
Println(“正在执行的模板:”,错误)
}
err=t.Execute(os.Stdout,TemplateData{
})
如果错误!=零{
Println(“正在执行的模板:”,错误)
}
}

在看不到您的代码的情况下,我只能提供

如果让我猜一猜,我会说您传递的数据是字符串,而不是字符串指针。字符串的值不能为nil/null,只有字符串指针可以。虽然这会产生一个“”,而不是一个“null”,(),所以我只能想象这是你在代码中做的奇怪的事情

为了防止链接腐烂,我复制了下面的代码示例,尽管点击链接查看它们的输出是值得的

所需功能

package main

import (
    "log"
    "os"
    "html/template"
)

type TemplateData struct {
    Email *string
}

func main() {

    const temp = "<script>var email = {{.Email}};</script>\n"

    t := template.Must(template.New("email_template").Parse(temp))
    email := "somebody@somewhere.com"
    err := t.Execute(os.Stdout, TemplateData{
        Email: &email,
    })
    if err != nil {
        log.Println("executing template:", err)
    }
    err = t.Execute(os.Stdout, TemplateData{
        Email: nil,
    })
    if err != nil {
        log.Println("executing template:", err)
    }

}
package main

import (
    "log"
    "os"
    "html/template"
)

type TemplateData struct {
    Email string
}

func main() {

    const temp = "<script>var email = {{.Email}};</script>\n"

    t := template.Must(template.New("email_template").Parse(temp))
    email := "somebody@somewhere.com"
    err := t.Execute(os.Stdout, TemplateData{
        Email: email,
    })
    if err != nil {
        log.Println("executing template:", err)
    }
    err = t.Execute(os.Stdout, TemplateData{
    })
    if err != nil {
        log.Println("executing template:", err)
    }

}
主程序包
进口(
“日志”
“操作系统”
“html/模板”
)
类型TemplateData结构{
电子邮件*字符串
}
func main(){
const temp=“var email={{.email}};\n”
t:=template.Must(template.New(“email_template”).Parse(temp))
电子邮件:=”somebody@somewhere.com"
错误:=t.Execute(os.Stdout,TemplateData{
电子邮件:&电子邮件,
})
如果错误!=零{
Println(“正在执行的模板:”,错误)
}
err=t.Execute(os.Stdout,TemplateData{
电邮:无,
})
如果错误!=零{
Println(“正在执行的模板:”,错误)
}
}
尝试使用“null”字符串

package main

import (
    "log"
    "os"
    "html/template"
)

type TemplateData struct {
    Email *string
}

func main() {

    const temp = "<script>var email = {{.Email}};</script>\n"

    t := template.Must(template.New("email_template").Parse(temp))
    email := "somebody@somewhere.com"
    err := t.Execute(os.Stdout, TemplateData{
        Email: &email,
    })
    if err != nil {
        log.Println("executing template:", err)
    }
    err = t.Execute(os.Stdout, TemplateData{
        Email: nil,
    })
    if err != nil {
        log.Println("executing template:", err)
    }

}
package main

import (
    "log"
    "os"
    "html/template"
)

type TemplateData struct {
    Email string
}

func main() {

    const temp = "<script>var email = {{.Email}};</script>\n"

    t := template.Must(template.New("email_template").Parse(temp))
    email := "somebody@somewhere.com"
    err := t.Execute(os.Stdout, TemplateData{
        Email: email,
    })
    if err != nil {
        log.Println("executing template:", err)
    }
    err = t.Execute(os.Stdout, TemplateData{
    })
    if err != nil {
        log.Println("executing template:", err)
    }

}
主程序包
进口(
“日志”
“操作系统”
“html/模板”
)
类型TemplateData结构{
电子邮件字符串
}
func main(){
const temp=“var email={{.email}};\n”
t:=template.Must(template.New(“email_template”).Parse(temp))
电子邮件:=”somebody@somewhere.com"
错误:=t.Execute(os.Stdout,TemplateData{
电邮:电邮,,
})
如果错误!=零{
Println(“正在执行的模板:”,错误)
}
err=t.Execute(os.Stdout,TemplateData{
})
如果错误!=零{
Println(“正在执行的模板:”,错误)
}
}

对代码示例进行最少的编辑:

type TplCtx struct {
  UserEmail *string
}


对代码示例使用最少的编辑量:

type TplCtx struct {
  UserEmail *string
}


我怀疑问题出在您的Go代码中,您没有提供该代码,因此很难判断。您是否在Go中用引号括住该值?以下是示例:它不起作用(您可以在线运行)。首先,请在共享前按格式按钮。它就在“共享”按钮旁边,使其更具可读性。其次,它在html/模板中记录了行为。下面是一个经过清理的示例,显示了这两个方面:我怀疑问题出在您的Go代码中,您没有提供该代码,因此很难判断。您是否在Go中用引号括住该值?以下是示例:它不起作用(您可以在线运行)。首先,请在共享前按格式按钮。它就在“共享”按钮旁边,使其更具可读性。其次,它在html/模板中记录了行为。下面是一个经过清理的示例,显示了这两个方面:@demi html/template自动转义上下文中的文本。因为字符串位于脚本上下文中,所以它被转换为javascript字符串。要获取null对象,需要传递一个文本nil,而不是包含单词“null”的字符串。请参阅我对所需功能的实现。@demi html/template会根据上下文自动转义文本。因为字符串位于脚本上下文中,所以它被转换为javascript字符串。要获取null对象,需要传递一个文本nil,而不是包含单词“null”的字符串。请参阅我对所需功能的实现。