传统 Web 基础操作:Go 模版引擎的极简入门指南

传统 Web 基础操作:Go 模版引擎的极简入门指南

Web操作

单控制器和多控制器

单控制器
type MyHandle struct{}func(m *MyHandle)ServeHTTP(w http.ResponseWriter, r *http.Request){ fmt.Fprint(w,"返回的数据哈哈")//相当于w.Write([]byte("返回的数据哈哈"))}funcmain(){ h := MyHandle{} server := http.Server{Addr:":8090", Handler:&h} server.ListenAndServe()//相当于http.ListenAndServe(":8090", &h)}
多控制器

在实际开发中,大部分情况不应该只有一个控制器,不同的请求应该交给不同的处理单元,在golang中支持两种多处理方式

  • 多个处理器(Handle)
  • 多个处理函数(HandleFunc)
1、多处理器

即使用http.Handle把不同的URL绑定到不同的处理器中

type MyHandle struct{}type MyOtherHandle struct{}func(m *MyHandle)ServeHTTP(w http.ResponseWriter, r *http.Request){ fmt.Fprint(w,"返回的数据哈哈")//相当于w.Write([]byte("返回的数据哈哈"))}func(m *MyOtherHandle)ServeHTTP(w http.ResponseWriter, r *http.Request){ fmt.Fprint(w,"返回的数据哈哈")//相当于w.Write([]byte("返回的数据哈哈"))}funcmain(){ h := MyHandle{} h2 := MyOtherHandle{} http.Handle("/a",&h) http.Handle("/abc",&h2) http.ListenAndServe(":8090",nil)}
2、多处理函数

把不同的URL绑定到不同的函数上

funcfirst(w http.ResponseWriter, r *http.Request){ fmt.Fprint(w,"多处理函数--first")//相当于w.Write([]byte("返回的数据哈哈"))}funcsecond(w http.ResponseWriter, r *http.Request){ fmt.Fprint(w,"多处理函数--second")//相当于w.Write([]byte("返回的数据哈哈"))}funcmain(){ http.HandleFunc("/f", first) http.HandleFunc("/s", second) http.ListenAndServe(":8090",nil)}

获取请求头和获取请求参数

1、获取请求头
funcnow(w http.ResponseWriter, r *http.Request){ h := r.Header fmt.Println(h) fmt.Println(h["Accept-Encoding"]) fmt.Println(len(h["Accept-Encoding"]))}funcmain(){ http.HandleFunc("/now", now) http.ListenAndServe(":9090",nil)}
2、获取请求参数
funcnow(w http.ResponseWriter, r *http.Request){ r.ParseForm()//必须先解析成Form,否则无数据 fmt.Println(r.Form) fmt.Println(r.Form["url_long"]) fmt.Println(r.Form["url_long"][0])}funcmain(){ http.HandleFunc("/now", now) http.ListenAndServe(":9090",nil)}
3、验证表单的输入
//验证手机号//使用MatchString函数和正则表达式//其他一些字符串都可以这样判断if m,_:= regexp.MatchString(`^(1[3|4|5|8][0-9]\d{4,8})$`, r.Form.Get("mobile"));!m {returnfalse}

Web项目结构

--项目名 --src --static --css --images --js --view --index.html --main.go

HTML模版和静态资源显示

1、HTML模版显示

Go语言标准库中html/template包提供了html模版支持,把HTML当作模版可以在访问控制器显示HTML模版信息

使用template.ParseFiles()可以解析多个模版文件

funcwelcome(w http.ResponseWriter, r *http.Request){ t,_:= template.ParseFiles("view/index.html") t.Execute(w,nil)}funcmain(){ http.HandleFunc("/", welcome) http.ListenAndServe(":9090",nil)}

目录结构

在这里插入图片描述
2、静态资源显示

把静态资源文件放到特定的文件夹中,使用Go语言的文件服务就可以进行加载

funcwelcome(w http.ResponseWriter, r *http.Request){ t,_:= template.ParseFiles("view/index.html") t.Execute(w,nil)}funcmain(){ http.HandleFunc("/", welcome) http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static")))) http.ListenAndServe(":9090",nil)}

目录结构

在这里插入图片描述

向模版中传递数据和调用函数

一、向模版中传递数据
  • 可以在HTML中使用{{}}获取template.Execute()第二个参数传递的值
  • 最常用的{{.}}中的".“是指针,指向当前变量,成为"dot”
1、字符串类型
funcwelcome(w http.ResponseWriter, r *http.Request){ t,_:= template.ParseFiles("view/index.html") t.Execute(w,"smallming")}funcmain(){ http.HandleFunc("/", welcome) http.ListenAndServe(":9090",nil)}
<body><pre> 尊敬的{{.}}先生/女士 您已经被我公司录取。 </pre></body>
2、结构体类型
type User struct{ Name string Age int}funcwelcome(w http.ResponseWriter, r *http.Request){ t,_:= template.ParseFiles("view/index.html") t.Execute(w, User{"张三",19})}funcmain(){ http.HandleFunc("/", welcome) http.ListenAndServe(":9090",nil)}
<body><pre> 姓名:{{.Name}}<br/> 年龄:{{.Age}} </pre></body>

PS:结构体的字段一定要首字母大写,否则模版访问不到。

3、map类型
type User struct{ Name string Age int}funcwelcome(w http.ResponseWriter, r *http.Request){ t,_:= template.ParseFiles("view/index.html") m :=make(map[string]interface{}) m["user"]= User{"张三",19} m["money"]=1000 t.Execute(w, m)}funcmain(){ http.HandleFunc("/", welcome) http.ListenAndServe(":9090",nil)}
<body><pre> 姓名:{{.user.Name}}<br/> 年龄:{{.user.Age}}<br/> 工资:{{.money}} </pre></body>
二、在模版中调用函数
1、调用系统函数
funcwelcome(w http.ResponseWriter, r *http.Request){ t,_:= template.ParseFiles("view/index.html") time1 := time.Now() t.Execute(w, time1)}funcmain(){ http.HandleFunc("/", welcome) http.ListenAndServe(":9090",nil)}
<body><pre> 完整时间:{{.}} 年:{{.Year}} 月:{{.Month}} 日:{{.Day}} 格式化时间:{{.Format "2006-01-02 15:04:05"}} </pre></body>
2、调用自定义函数

如果希望调用自定义函数,需要借助html/template包下的FuncMap进行映射。

函数被添加映射后,只能通过函数在FuncMap中的key调用函数。

funcMyFormat(t time.Time)string{return t.Format("2006-01-02 15:04:05")}funcwelcome(w http.ResponseWriter, r *http.Request){//将自定义函数绑定到map上 fm := template.FuncMap{"mf": MyFormat}//新建一个空模版,将函数绑定到该模版 t := template.New("index.html").Funcs(fm)//把我们的html解析到该空模版上 t,_= t.ParseFiles("view/index.html") time1 := time.Now() t.Execute(w, time1)}funcmain(){ http.HandleFunc("/", welcome) http.ListenAndServe(":9090",nil)}
<body><pre> 完整时间:{{.}} 调用格式化函数:{{mf .}} </pre></body>

模版使用if、range等

1、二元比较运算函数
eq <=>== ne <=>!= lt <=>< le <=><= gt <=>> ge <=>>=
2、if语句
<body> 取出数据{{.}}<br/> {{if .}} 执行了if {{else}} 执行了else {{end}}<br/> html模版信息 </body>
<body> {{$n:=123}} {{if gt $n 456}} 执行if {{else}} 执行else {{end}} </body>
3、range的使用
<body> {{.}}<br/> {{range .}} {{.}}<br/> {{end}} </body>

模版嵌套

  • 在实际项目中常常出现页面复用的情况,例如:整个网站的头部信息和底部信息复用
  • 可以使用动作{{template “模版名称”}}来引用模版
  • 引用的模版必须在HTML中定义这个模版

定义名称

{{define "模版名称"}} html {{end}} 

示例:

{{define "head"}} <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body> head.html {{.}} </body></html> {{end}} 
{{define "foot"}} <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body> foot.html {{.}} </body></html> {{end}} 
{{define "layout"}} <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scripttype="text/javascript"src="/static/js/index.js"></script></head><body> {{/*引用head模版*/}} {{template "head" "head的参数"}}<br/> 中间内容<br/> {{template "foot" "head的参数"}} </body></html> {{end}} 

在go中需要加载所有文件再选定主模版

funcwelcome(w http.ResponseWriter, r *http.Request){//解析所有文件 t, err := template.ParseFiles("view/index.gohtml","view/head.gohtml","view/foot.gohtml")if err !=nil{ log.Printf("err:%v", err)}//选定主模版layout t.ExecuteTemplate(w,"layout",nil)}funcmain(){ http.HandleFunc("/", welcome) http.ListenAndServe(":9090",nil)}

文件上传

文件中ioutil包已经弃用,这里使用io包和os包

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>文件上传</title></head><body><formaction="upload"method="post"enctype="multipart/form-data"> 文件名:<inputtype="test"name="name"/><br/> 文件:<inputtype="file"name="file"/><br/><inputtype="submit"value="提交"/></form></body></html>
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>文件上传</title></head><body> 文件上传成功 </body></html>
funcwelcome(w http.ResponseWriter, r *http.Request){ t,_:= template.ParseFiles("view/filetest.gohtml") t.Execute(w,nil)}funcupload(w http.ResponseWriter, r *http.Request){//从表单中获取名为"name"的值 fileName := r.FormValue("name")//从表单中获取名为"file"的文件字段//file是文件句柄//fileHeader是文件的元信息,包括文件名、大小等 file, fileHeader,_:= r.FormFile("file")//读取文件中的内容 b,_:= io.ReadAll(file) os.WriteFile("D:/"+fileName+fileHeader.Filename[strings.LastIndex(fileHeader.Filename,"."):], b,0777) t,_:= template.ParseFiles("view/success.gohtml") t.Execute(w,nil)}funcmain(){ http.HandleFunc("/", welcome) http.HandleFunc("/upload", upload) http.ListenAndServe(":9090",nil)}

文件下载

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>文件上传</title></head><body><ahref="download?filename=abc.png">下载</a></body></html>
funcdownload(w http.ResponseWriter, r *http.Request){//从表单中获取文件名称 filename := r.FormValue("filename")//根据路径去找文件 f, err := os.ReadFile("D:/"+ filename)if err !=nil{ fmt.Fprintln(w,"文件下载失败", err)return} h := w.Header()//设置相应内容的MIME类型魏二进制流//设置为文件处理,而不是直接显示 h.Set("Content-Type","application/octet-stream")//attachment设置内容处置方式为附件下载//filename="..."指定下载时的默认文件名filename h.Set("Content-Disposition","attachment;filename="+filename)//将文件内容写入http响应体发送 w.Write(f)}

Read more

DeepFace深度学习库+OpenCV实现——情绪分析器

DeepFace深度学习库+OpenCV实现——情绪分析器

目录 应用场景 实现组件 1. 硬件组件 2. 软件库与依赖 3. 功能模块 代码详解(实现思路) 导入必要的库 打开摄像头并初始化变量 主循环 FPS计算 情绪分析及结果展示 显示FPS和图像 退出条件 编辑 完整代码 效果展示 自然的 开心的 伤心的 恐惧的 惊讶的  效果展示 自然的 开心的 伤心的 恐惧的 惊讶的   应用场景         应用场景比较广泛,尤其是在需要了解和分析人类情感反应的场合。: 1. 心理健康评估:在心理健康领域,可以通过长期监控和分析一个人的情绪变化来辅助医生进行诊断或治疗效果评估。 2. 用户体验研究:在产品设计、广告制作或网站开发过程中,通过观察用户在使用过程中的情绪反应,来优化产品的用户体验。 3. 互动娱乐:在游戏或虚拟现实应用中,根据玩家的情绪状态动态调整游戏难度或故事情节,以增加沉浸感和互动性。

By Ne0inhk
最全java面试题及答案(208道)

最全java面试题及答案(208道)

本文分为十九个模块,分别是:「Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM」 ,如下图所示: 共包含 208 道面试题,本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单,下面一起进入主题吧。 Java 基础 1. JDK 和 JRE 有什么区别? * JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java

By Ne0inhk
用 DeepSeek 打造你的超强代码助手

用 DeepSeek 打造你的超强代码助手

DeepSeek Engineer 是啥? 简单来说,DeepSeek Engineer 是一个基于命令行的智能助手。它能帮你完成这些事: * 快速读文件内容:比如你有个配置文件,直接用命令把它加载进助手,后续所有操作都可以基于这个文件。 * 自动改文件:它不仅能提建议,还可以直接生成差异表(diff),甚至自动应用修改。 * 智能代码生成:比如你让它生成代码片段,它会按照指定格式和规则直接返回。 更重要的是,这一切都是通过 DeepSeek 的强大 API 来实现的。想象一下,你有个贴身助手,不仅能听懂你的代码需求,还能直接动手帮你写! 核心功能拆解 我们先来看 DeepSeek Engineer 的几个核心能力,让你更好地理解它的强大之处。 1. 自动配置 DeepSeek 客户端 启动这个工具时,你只需要准备一个 .env 文件,里面写上你的 API Key,比如: DEEPSEEK_API_

By Ne0inhk
10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?

10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?

文章目录 * 一、引言 * 云计算平台概览 * ToDesk云电脑:随时随地用上高性能电脑 * 二 .云电脑初体验 * DeekSeek介绍 * 版本参数与特点 * 任务类型表现 * 1、ToDesk云电脑 * 2、顺网云电脑 * 3、海马云电脑 * 三、DeekSeek本地化实操和AIGC应用 * 1. ToDesk云电脑 * 2. 海马云电脑 * 3、顺网云电脑 * 四、结语 * 总结:云电脑如何选择? 一、引言 DeepSeek这些大模型让 AI 开发变得越来越有趣,但真要跑起来,可没那么简单! * 本地配置太麻烦:显卡不够、驱动难装、环境冲突,光是折腾这些就让人心态崩了。 * 云端性能参差不齐:选错云电脑,可能卡到爆、加载慢,还容易掉线,搞得效率直线下降。 * 成本难控:有的平台按小时计费,价格一会儿一个样,

By Ne0inhk