用于动态html的GO模板

Suy*_*yog 0 google-app-engine templates go

任何人都可以告诉我如何使用GO模板在https://developers.google.com/appengine/docs/java/gettingstarted/usingjsps上编写像guestbook.jsp这样的简单页面?

在我看来,很容易编写一个有效的,但我想知道它是否可以像JSP页面一样简洁地完成.

有两个问题,我不知道如何解决

  1. JSP页面使用两个对象user和request,而模板创建只需一个.
  2. 如果我们使用单独的模板生成注销链接和留言簿,那么我们如何将它们嵌套在主页面中呢?

yng*_*ing 10

我所做的是创建一个结构(我称之为"页面"对象),用我需要的实体填充它,然后在模板中对它们进行操作.

func myPage(w http.ResponseWriter, r *http.Request) {
    var user *User // fetch from somewhere

    page := struct {        
        Title     string
        User      *User
    }{"My title", user}

    return templates.ExecuteTemplate(w, "myPage", page)
}
Run Code Online (Sandbox Code Playgroud)

模板看起来像这样,使您可以访问结构中的所有字段:

{{define "myPage"}}
{{template "head" .}}

Title: {{.Title}}<br />
Name: {{.User.Name}}<br />

{{template "tail" .}}
{{end}}
Run Code Online (Sandbox Code Playgroud)

(请注意,{{template "head" .}}它将包含另一个模板,此处为页眉和页脚.)

我经常使用的另一件事是模板中的变量.您可以使用美元符号定义变量.

以下示例不是很优雅,但可能会让您了解可能的内容.想象一下,我们有三个切片:一个带有" User"对象,一个带有" Spot"对象,一个带有" Checkin"对象.它们的长度都相同,并且按位置相关(每个索引0包含已签入的用户,他/她签入的地点,以及签入对象包含它发生的时间)."range"将在切片上进行迭代时给出两个变量:index($i在示例中)和值($v).使用"index"可以在切片中请求实体,因此{{$user := index $checkinUsers $i}}会在$ i指向的位置给出对象.

{{$checkinUsers := .CheckinUsers}}
{{$checkinSpots := .CheckinSpots}}
{{range $i, $v := .Checkins}}
    {{$user := index $checkinUsers $i}}
    {{$spot := index $checkinSpots $i}}
    <tr>
        <td>
            {{$user.FirstName}} {{$user.LastName}} @ {{$spot.Description}} ({{$v.Time}})<br />
        </td>
    </tr>
    {{end}}
Run Code Online (Sandbox Code Playgroud)

同样,这个例子不是很优雅,但我希望你能看到在Go中创建动态HTML就像在JSP中一样容易(我的经验是结果页面比JSP更清晰,因此更容易理解经验不足的网络开发者和设计师).

Ex animo,/ Alexander Yngling.