Go语言 变量更改名称后呈现失败

kknvjkwl  于 2023-03-16  发布在  Go
关注(0)|答案(1)|浏览(128)

与这个question相关的,我有一些Golang代码here,目前localhost:8080/search-availability渲染正常,其内容如下:

如果我将templates\search-availability.page.tmpl的第13行改为:

<input type="text" name="csrf_token" value="{{.CsrfToken}}">

转换为:

<input type="text" name="csrf_token" value="{{.WrongToken}}">

任何低于Search for Availability的值都将消失。
为了调试另一个问题中提到的问题,我想在pkg\models\templatedata.go中进行重命名:

type TemplateData struct {
    StringMap map[string]string
    IntMap    map[string]int
    FloatMap  map[string]float64
    Data      map[string]interface{}
    // CsrfToken string
    Token string
    Flash     string
    Error     string
}

基本上,CsrfToken被缩短为Token。为了适应这种变化,templates\search-availability.page.tmpl的第13行被修改为:

<!-- <input type="text" name="csrf_token" value="{{.CsrfToken}}"> -->
<input type="text" name="csrf_token" value="{{.Token}}">

(我只注解掉旧值,稍后会更清楚)因此,pkg\render\render.go做了如下更改:

func AddDefaultData(td *models.TemplateData, r *http.Request) *models.TemplateData {
    // td.CsrfToken = nosurf.Token(r)
    fmt.Printf("Token before: %s\n", td.Token)
    td.Token = nosurf.Token(r)
    fmt.Printf("Token after: %s\n", td.Token)
    return td
}

然后我运行go run ./cmd/web/*.go看看它是否工作,令人惊讶的是,Search for Availability下面的所有内容都不见了,这是终端的输出:

Starting a server on port :8080
2023/03/12 23:54:46 SessionLoad
2023/03/12 23:54:46 NoSurf
2023/03/12 23:54:47 Hit the page
2023/03/12 23:54:47 Availability
Token before: 
Token after: ERyPRtSgyVxmtthfMD49BsysXczubQfn7SQ3+L0ntc+6PQoHlaykAYejIa6Vw4m4omkgO94tVi/YiD0baSz2yw==

VS Code代码完成可以拾取td.Token,并且终端显示该变量存在。为什么它的行为与使用WrongToken时一样?删除这两行将返回Arrival及以下内容:

<!-- <input type="text" name="csrf_token" value="{{.CsrfToken}}"> -->
<input type="text" name="csrf_token" value="{{.Token}}">

我在这里不知所措。为什么会发生这种情况?任何见解都非常感谢。

rt4zxlrg

rt4zxlrg1#

HTML注解中的模板表达式仍然会被计算。不存在的字段的存在将导致Execute()停止并返回错误。
或者,您可以使用模板注解(参见text/template文档中操作列表的第一个条目),这将导致在执行模板时丢弃所包含的内容。
这里有一个小例子来说明:

package main

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

func main() {
    const validTpl = `
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>example page</title>
    </head>
    <body>
        A field: {{.Field}}<br>
        A non-existent field within a template comment: {{/* {{.NonExistenField}} within a template comment */}}
        A non-existent field within an HTML comment: <!-- {{.NonExistentField}} -->
    </body>
</html>`

    t, err := template.New("webpage").Parse(validTpl)
    if err != nil {
        log.Fatal(err)
    }

    data := struct {
        Field string
    }{
        Field: "data",
    }

    err = t.Execute(os.Stdout, data)
    if err != nil {
        log.Fatal(err)
    }
}

输出:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>example page</title>
    </head>
    <body>
        A field: data<br>
        A non-existent field within a template comment: 
        A non-existent field within an HTML comment: 2009/11/10 23:00:00 template: webpage:11:54: executing "webpage" at <.NonExistentField>: can't evaluate field NonExistentField in type struct { Field string }

Program exited.

Go Playground

相关问题