Template Basic

本系列均参考https://github.com/bonfy/go-mega/blob/master/02-template-basic.md

只是为了监督自己写的博客

这里就不介绍什么是模板了,一般来说,我们使用html文件作为我们的模板文件

我们首先创建一个

类似于这样的模板

package main

import (
    "html/template"
    "net/http"
)

// User struct
type User struct {
    Username string
}

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        user := User{Username: "bonfy"}
        tpl, _ := template.New("").Parse(`<html>
            <head>
                <title>Home Page - Bonfy</title>
            </head>
            <body>
                <h1>Hello, {{.Username}}!</h1>
            </body>
        </html>`)
        tpl.Execute(w, &user)
    })//Parse后面跟的是html文件,后文中我们将把这些代码变成一个文件,直接解析一个文件
    http.ListenAndServe(":8888", nil)
}

如果对HTML文档不是很熟悉,可以看一下,我们后端的只要能大概看得懂HTML就可以了

之后我们建立一个文件夹,将静态文件都放到这个文件夹中

将模板的内容移到 static文件夹下

static/index.html

<html>
    <head>
        <title>Home Page - Bonfy</title>
    </head>
    <body>
        <h1>Hello, {{.Username}}!</h1>
    </body>
</html>

然后我们的main文件就变成了下面这个样子

package main

import (
    "html/template"
    "net/http"
)

// User struct
type User struct {
    Username string
}

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        user := User{Username: "bonfy"}
        tpl, _ := template.ParseFiles("templates/index.html")
      //这里就是直接解析这个模板文件
        tpl.Execute(w, &user)
    })
    http.ListenAndServe(":8888", nil)
}

之后我们需要学习有关模板的常用操作

模板的常用操作

条件语句

<html>
<head>
    {{if .Title}}
    <title>{{.Title}} - blog</title>
    {{else}}
    <title>Welcome to blog!</title>
</head>
<body>
<h1>Hello,{{.Username}}!</h1>
</body>
</html>

这里要去弄懂一下这个 . 是啥意思

chatgpt说

在这个HTML代码中,.Title.Username是占位符,用于表示将在渲染(或填充)HTML模板时提供的实际值。通常,这些值由服务器端的后端代码生成,并通过模板引擎嵌入到HTML中,最终发送给客户端的浏览器。

.Title.Username 在这里是模板中的变量,它们的值将根据后端代码的逻辑来确定。在这个例子中,.Title 用于设置页面标题,.Username 用于向用户显示其用户名。如果在渲染HTML时没有提供 .Title 的值,那么标题将默认为 "Welcome to blog!"。

就是说.后面的值通常都是后端代码提供的,所以我们发现之前的代码还缺少一个Title这个值,没有

修改main文件

package main

import (
    "html/template"
    "net/http"
)

type User struct {
    Username string
}

type IndexxViewModel struct {
    Title string
    User  User //嵌套结构体
}

func main() {
    http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
        user := User{
            "bonfy",
        }
        v := IndexxViewModel{Title: "HomePage", User: user}
        tpl, err := template.ParseFiles("C:\\Users\\Lenovo\\Desktop\\learn_web\\templateBasic\\static\\index.html")
        if err != nil {
            panic(err)
        }
        tpl.Execute(writer, &v)
    })
    http.ListenAndServe("localhost:8080", nil)
}
<html>
<head>
    {{if .Title}}
    <title>{{.Title}} - blog</title>
    {{else}}
    <title>Welcome to blog!</title>
    {{end}}
</head>
<body>
<h1>Hello,{{.User.Username}}!</h1>
<!--这里.User.Username自己打的时候没有注意,就出错了-->
</body>
</html>

循环

建议大家还是把html文件还是打一下,因为你打一下会发现有些小细节会忽略

<html>
    <head>
        {{if .Title}}
            <title>{{.Title}} - blog</title>
        {{else}}
            <title>Welcome to blog!</title>
        {{end}}
    </head>
    <body>
        <h1>Hello, {{.User.Username}}!</h1>
        {{range .Posts}}
            <div><p>{{ .User.Username }} says: <b>{{ .Body }}</b></p></div>
        {{end}}
    </body>
</html>

我对于html代码也不是很了解

这里将

and and

说一下:

就是一个块的意思,这里就是将内容分组,因为每个人说话就会分个组嘛,和评论一样

是段落的意思,是为了将文本组织成段落,用于排版

用来包裹用户的发表内容,使其在这个段落中显示

是加粗的意思,对结构体中Body属性进行加粗

我后面解析文件地址的时候都是引用绝对的地址,因为懒得想事情了,go程序的当前工作目录可能不是我期望的路径

每次更新html文件代码的时候,记得加{{end}}

main代码

package main

import (
    "html/template"
    "net/http"
)

type User struct {
    Username string
}
type Post struct {
    User User
    Body string
}

type IndexxViewModel struct {
    Title string
    User  User //嵌套结构体
    Posts []Post
}

func main() {
    http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
        u1 := User{Username: "bofy"}
        u2 := User{Username: "rene"}
        posts := []Post{
            {User: u1, Body: "Hardwroking..."},
            {User: u2, Body: "加油努力,还有很长的路要走"},
        }
        v := IndexxViewModel{Title: "Homepage", User: u1, Posts: posts}
        tpl, err := template.ParseFiles("C:\\Users\\Lenovo\\Desktop\\learn_web\\templateBasic\\static\\index.html")
        if err != nil {
            panic(err)
        }
        tpl.Execute(writer, &v)

    })
    http.ListenAndServe("localhost:8080", nil)
}

<html>
<head>
    {{if .Title}}
    <title>{{.Title}} - blog</title>
    {{else}}
    <title>Welcome to blog!</title>
    {{end}}
</head>
<body>
<h1>Hello,{{.User.Username}}!</h1>
{{range .Posts}}
<div><p>{{.User.Username}} says:<b>{{.Body}}</b></p></div>
{{end}}
</body>
</html>

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/516666.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《数字图像处理》-上机 5 图像阈值化处理、霍夫变换及形态学算法

一、上机目的 学习图像阈值化处理、霍夫变换、形态学算法及编程实现方法 二、相关知识及练习 1、图像阈值化处理 图像阈值化&#xff08;Binarization&#xff09;旨在剔除掉图像中一些低于或高于一定值的像素&#xff0c;从而提 取图像中的物体&#xff0c;将图像的背景和…

ComfyUI ClipSeg插件报错- resize_image出错应该怎么办

上一篇刚介绍了这个插件&#xff0c;结果emm..很快发现事情并不简单...结果又报错了。 后台报错信息&#xff1a; Unused or unrecognized kwargs: padding. !!! Exception during processing !!! Traceback (most recent call last): File "F:\ComfyUI-aki\execution.p…

4.2总结

了解了部分Api的使用并学习了接口的API API API包含了较多种类&#xff08;System,Runtime等&#xff09; System其实就是一个工具类&#xff0c;提供了一些与系统相关的方法 下面有一些常间的System方法 方法名说明public static void exit (int status)终止当前运行的ja…

配置code-server和texlive实现网页写tex

使用overleaf太卡了&#xff0c;有云服务器或者nas小主机&#xff0c;配置自己的code-servertexlive&#xff0c;来写论文。 之前用服务器配置过自己的overleaf&#xff0c;感觉不是很好用&#xff0c;缺少东西。 一、思路 使用docker先安装一个ubuntu&#xff0c;用dockerfil…

基于Python的微博舆论分析,微博评论情感分析可视化系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

c 语言 插值搜索(Interpolation Search)

给定一个由 n 个均匀分布值 arr[] 组成的排序数组&#xff0c;编写一个函数来搜索数组中的特定元素 x。 线性搜索需要 O(n) 时间找到元素&#xff0c;跳转搜索需要 O(? n) 时间&#xff0c;二分搜索需要 O(log n) 时间。 插值搜索是对实例二分搜索的改进&#xff0c;…

(Mac/win)Lightroom Classic 2024---摄影师的必备工具,解锁图片处理新境界

Lightroom Classic 2024是一款由Adobe公司推出的专业照片编辑和管理软件。它提供了全面的照片处理工具&#xff0c;包括裁剪、色彩调整、滤镜等&#xff0c;并支持RAW格式编辑。该软件以强大的组织和管理功能闻名&#xff0c;允许用户通过关键字、标签等方式轻松查找和整理照片…

SAP新的扩展策略

在软件即服务&#xff08;SaaS&#xff09;应用的推动下&#xff0c;SAP Cloud优先的战略非常明显&#xff0c;随之带来的是SAP Clean core的战略&#xff0c;从经典的 ABAP 可扩展性模式转变为 SAP S/4HANA 现代可扩展性模式。那么Clean core战略到底是什么&#xff1f;新的扩…

MATLAB 统计滤波(去除点云噪声)(55)

MATLAB 统计滤波法(去除点云噪声)(55) 一、算法介绍二、算法实现1.原理2.代码一、算法介绍 点云统计滤波,是一种常用的去噪点方法,原始的点云数据中包含多种噪点,无法直接使用,往往需要通过一些方法去除噪点,而统计滤波在这方面的使用非常广泛常见,下面是去噪点后的…

书生作业2

Task 1 生成200字以上的笑话&#xff0c;可以看到使用不同的提示词&#xff0c;会有不同的效果。 如果使用提示词“讲一个笑话.200字以上”&#xff0c; 会有偶发的输出较短的笑话的情况。 如果使用提示词“讲一个200字以上的笑话”时&#xff0c;结果相对稳定。 下载目前两种…

MinGW使用std::thread报错error: ‘thread‘ is not a member of ‘std‘

目录 问题描述简单的测试代码报错及解决 问题描述 在windows上用vscode编写c代码进行编译时&#xff0c;一直上报error: ‘thread’ is not a member of std’的错误&#xff0c;搜索该错误上报都是说c版本不匹配&#xff0c;然后我在task.json里面添加了-stdc11之后还是报错&…

【Vue】watch监听复杂数据,新值与旧值一样

问题 watch监听复杂数据&#xff0c;例如数组&#xff0c;旧值与新值一样 解决方案 监听回调里返回新数组&#xff0c;新、旧数组地址改变&#xff0c;得到的值也就不一样&#xff0c;例↓ ()>[...data] 码 test.js // 数据 const musicList ref([{ id: 540000200805…

STM32-05基于HAL库(CubeMX+MDK+Proteus)串行通信案例(中断方式接收命令)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式&#xff0c;生成代码四、MDK打开生成项目&#xff0c;编写HAL库的功能代码五、运行仿真程序&#xff0c;调试代码 一、功能需求分析 在中断机制实现按键检测的案例之后&#xff0c;我们介绍串…

Rust egui(4) 增加自己的tab页面

如下图&#xff0c;增加一个Sins也面&#xff0c;里面添加一个配置组为Sin Paraemters&#xff0c;里面包含一个nums的参数&#xff0c;范围是1-1024&#xff0c;根据nums的数量&#xff0c;在Panel中画sin函数的line。 demo见&#xff1a;https://crazyskady.github.io/index.…

3. python练习题3-自由落体

3. python练习题3-自由落体 【目录】 文章目录 3. python练习题3-自由落体1. 目标任务2. 解题思路3. 知识回顾-%占位符格式化处理3.1 概述3.2 占位符的多种用法3.3 格式化操作符辅助指令3.4 将整数和浮点数格式化为字符串 4. 解题思路4.1 球第1次下落4.2 球第2次下落 5. 最终代…

可能是最便宜的姿态传感器,国产三轴加速度计SC7A20

可能是最便宜的姿态传感器 三轴检测 批量参考价格&#xff1a;整盘单价&#xff1a;1.242&#xff0c;一个包装10K&#xff0c;希望厂家能出点数量少的包装&#xff0c;这一盘太多了&#xff1a;&#xff09; 特点 宽电压范围 1.71V-3.6V 1.8V 兼容数字 IO 口 低功耗模式下…

【论文精读】 GPT,GPT-2,GPT-3:大力出奇迹

系列文章目录 【论文精读】Transformer&#xff1a;Attention Is All You Need 【论文精读】BERT&#xff1a;Pre-training of Deep Bidirectional Transformers for Language Understanding 文章目录 系列文章目录一、前言二、GPT&#xff08;一&#xff09;文章概览&#xf…

44.网络游戏逆向分析与漏洞攻防-角色管理功能通信分析-角色创建服务器反馈数据包分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

vue快速入门(五)v-show与v-if

注释很详细&#xff0c;直接上代码 上一篇 新增内容 v-if与v-show底层的区别v-if与v-show的效果 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

排序算法-希尔排序

希尔排序是插入排序的一种改进版本&#xff0c;通过将整个序列按一定间隔分组&#xff0c;对每个分组进行插入排序&#xff0c;然后逐渐减小间隔&#xff0c;直到间隔为1&#xff0c;最后对整个序列进行一次插入排序。希尔排序的核心思想是利用插入排序对近乎有序的序列进行排序…