96SEO 2026-02-20 04:14 35
框架运行速度非常快如果你是性能和高效的追求者我们推荐你使用Gin框架。

Gin最擅长的就是Api接口的高并发如果项目的规模不大业务相对简单这个时候我们也推荐您使用Gin。
当某个接口的性能遭到较大挑战的时候这个还是可以考虑使用Gin重写接口。
启动HTTP服务默认在0.0.0.0:8080启动服务r.Run()
所谓热加载就是当我们对代码进行修改时程序能够自动重新加载并执行这在我们开发中是非常便利的可以快速进行代码测试省去了每次手动重新编译
beego中我们可以使用官方给我们提供的bee工具来热加载项目但是gin中并没有官方提供的热加载工具这个时候我们要实现热加载就可以借助第三方的工具。
API是目前比较成熟的一套互联网应用程序的API设计理论所以我们设计我们的路由的时候建议参考RESTful
在RESTful架构中每个网址代表一种资源不同的请求方式表示执行不同的操作
是map[string]interface{}的缩写r.GET(/someJSON,
方式一自己拼接JSONc.JSON(http.StatusOK,
将输出x({\foo\:\bar\})c.JSONP(http.StatusOK,
是map[string]interface{}的缩写r.GET(/someXML,
方式一自己拼接JSONc.XML(http.StatusOK,
1、我们首先在项目根目录新建templates文件夹然后在文件夹中新建index.html
initial-scale1.0titleDocument/title
bodyh1这是一个html模板/h1h3{{.title}}/h3
/html2、Gin框架中使用c.HTML可以渲染模板渲染模板前需要使用LoadHTMLGlob()或者LoadHTMLFiles()方法加载模板。
(net/httpgithub.com/gin-gonic/gin
gin.Default()router.LoadHTMLGlob(templates/*)//router.LoadHTMLFiles(templates/template1.html,
templates/template2.html)router.GET(/,
Gin框架中如果不同目录下面有同名模板的话我们需要使用下面方法加载模板
initial-scale1.0titleDocument/title/headbodyh1后台模板/h1h3{{.title}}/h3/body/html
initial-scale1.0titleDocument/title/headbodyh1前台模板/h1h3{{.title}}/h3/body/html
(net/httpgithub.com/gin-gonic/gin
gin.Default()router.LoadHTMLGlob(templates/**/*)
模板语法都包含在{{和}}中间其中{{.}}中的点表示当前对象。
当我们传入一个结构体对象时我们可以根据.来访问结构体的对应字段。
例如
(net/httpgithub.com/gin-gonic/gin
gin.Default()router.LoadHTMLGlob(templates/**/*)user
initial-scale1.0titleDocument/title
bodyh1前台模板/h1h3{{.title}}/h3h4{{.user.Name}}/h4h4{{.user.Age}}/h4
注释执行时会忽略。
可以多行。
注释不能嵌套并且必须紧贴分界符始止。
我们还可以在模板中声明变量用来保存传入模板的数据或其他语句生成的结果。
具体语法如下
有时候我们在使用模板语法的时候会不可避免的引入一下空格或者换行符这样模板最终渲染出来的内容可能就和我们想的不一样这个时候可以使用{{-语法去除模板内容左侧的所有空白符号
Go的模板语法中使用range关键字进行遍历有以下两种写法其中pipeline的值必须是数组、切片、字典或者通道。
h4{{.user.Name}}/h4h4{{.user.Gender}}/h4h4{{.user.Age}}/h4
.user}}h4姓名{{.Name}}/h4h4性别{{.user.Gender}}/h4h4年龄{{.Age}}/h4{{end}}
执行模板时函数从两个函数字典中查找首先是模板函数字典然后是全局函数字典。
一般不在模板内定义函数而是使用Funcs方法添加函数到模板里。
3返回x[1][2][3]的值每个被索引的主体必须是数组、切片或者字典。
执行结果是调用第一个参数的返回值该参数必须是函数类型其余参数作为调用该函数的参数
call的第一个参数的执行结果必须是函数类型的值和预定义函数如print明显不同
该函数类型值必须有1到2个返回值如果有2个则后一个必须是error接口类型
如果有2个返回值的方法返回的error非nil模板执行会中断并返回给调用模板执行者该错误
router.SetFuncMap(template.FuncMap{formatDate:
(fmthtml/templatenet/httptimegithub.com/gin-gonic/gin
注意顺序注册模板函数需要在加载模板上面router.SetFuncMap(template.FuncMap{formatDate:
formatAsDate,})//加载模板router.LoadHTMLGlob(templates/**/*)
time.Now(),})})router.Run(:8080)
1、新建templates/deafult/page_header.html
当我们渲染的HTML文件中引用了静态文件时,我们需要配置静态web服务
r.LoadHTMLGlob(“templates/**/*”)
前面章节我们给大家介绍了路由基础以及路由配置这里我们详细给大家讲讲路由传值、路由返回值
为了能够更方便的获取请求相关参数提高开发效率我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryString、form表单、JSON、XML等参数到结构体中。
下面的示例代码演示了.ShouldBind()强大的功能它能够基于请求自动提取JSON、form表单和QueryString类型的数据并把值绑定到指定的结构体对象。
/?usernamezhangsanpassword123456
{“user”:“zhangsan”,“password”:“123456”}
{“user”:“zhangsan”,“password”:“123456”}
来作为数据交互的格式这个时候我们可以在gin中使用c.GetRawData()获取数据。
8.2.1、新建routes文件夹routes文件下面新建adminRoutes.go、apiRoutes.go、defaultRoutes.go
新建controller/admin/NewsController.go
新建controller/admin/UserController.go
1、新建controller/admin/BaseController.go
Gin框架允许开发者在处理请求的过程中加入用户自己的钩子Hook函数。
这个钩子函数就叫中间件中间件适合处理一些公共的业务逻辑比如登录认证、权限校验、数据分页、记录日志、耗时统计等。
Gin中的中间件必须是一个gin.HandlerFunc类型配置路由的时候可以传递多个func回调函数最后一个func回调函数前面触发的方法都可以称为中间件。
中间件里面加上ctx.Next()可以让我们在路由匹配完成后执行一些操作。
Go语言中的Since()函数保留时间值并用于评估与实际时间的差异
fmt.Println(“initMiddlewareOne–1-执行中中间件”)
ctx.Next()fmt.Println(initMiddlewareOne--2-执行中中间件)
fmt.Println(“initMiddlewareTwo–1-执行中中间件”)
ctx.Next()fmt.Println(initMiddlewareTwo--2-执行中中间件)
fmt.Println(“initMiddlewareOne–1-执行中中间件”)
ctx.Next()fmt.Println(initMiddlewareOne--2-执行中中间件)
fmt.Println(“initMiddlewareTwo–1-执行中中间件”)
ctx.Abort()fmt.Println(initMiddlewareTwo--2-执行中中间件)
可以通过ctx.Set在请求上下文中设置值后续的处理函数能够取到该值
gin.Default()默认使用了Logger和Recovery中间件其中
•Logger中间件将日志写入gin.DefaultWriter即使配置了GIN_MODErelease。
•Recovery中间件会recover任何panic。
如果有panic的话会写入500响应码。
如果不想使用上面两个默认的中间件可以使用gin.New()新建一个没有任何默认中间件的路由。
当在中间件或handler中启动新的goroutine时不能使用原始的上下文c
里面处理常见的业务逻辑。
但是如果我们有一个功能想在多个控制器、或者多个模板里面复用的话那么我们就可以把公共的功能单独抽取出来作为一个模块Model。
打开golang包对应的网站https://pkg.go.dev/搜索md5
注意需要在上传文件的form表单上面需要加入enctype“multipart/form-data”
上传文件至指定目录c.SaveUploadedFile(file,
需要在上传文件的form表单上面需要加入enctype“multipart/form-data”
{ctx.JSON(http.StatusInternalServerError,
需要在上传文件的form表单上面需要加入enctype“multipart/form-data”
需要在上传文件的form表单上面需要加入enctype“multipart/form-data”
file.Filename)ctx.SaveUploadedFile(file,
需要在上传文件的form表单上面需要加入enctype“multipart/form-data”
path.Ext(file.Filename)allowExtMap
strconv.FormatInt(models.GetUnix(),
10)//static/upload/20200623/144325235235.pngsaveDir
fileUnixNameextName)ctx.SaveUploadedFile(file,
HTTP是无状态协议。
简单地说当你浏览了一个页面然后转到同一个网站的另一个页面服务器无法认识到这是同一个浏览器在访问同一个网站。
每一次的访问都是没有任何关系的。
如果我们要实现多个页面之间共享数据的话我们就可以使用Cookie或者Session实现
是存储于访问者计算机的浏览器中。
可以让我们用同一个浏览器访问同一个域名的时候共享数据。
过期时间.如果只想设置Cookie的保存路径而不想设置存活时间可以在第三个参数中传递nil
httpOnly是微软对COOKIE做的扩展。
如果在COOKIE中设置了“httpOnly”属性则通过程序JS脚本、applet等将无法读取到COOKIE信息防止XSS攻击产生
c.Cookie(usrename)c.String(200,
2、我们想的是用户在a.itying.com中设置Cookie信息后在b.itying.com中获取刚才设置的cookie也就是实现多个二级域名共享cookie
session是另一种记录客户状态的机制不同的是Cookie保存在客户端浏览器中而session保存在服务器上。
当客户端浏览器第一次访问服务器并发送请求时服务器端会创建一个session对象生成一个类似于key,value的键值对
然后将key(cookie)返回到浏览器(客户)端浏览器下次再访问时携带key(cookie)找到对应的session(value)。
Gin官方没有给我们提供Session相关的文档这个时候我们可以使用第三方的Session中间件来实现
github.com/gin-contrib/sessions
“github.com/gin-contrib/sessions”
“github.com/gin-contrib/sessions/cookie”
cookie.NewStore([]byte(“secret11111”))
设置session中间件参数mysession指的是session的名字也是cookie的名字
r.Use(sessions.Sessions(“mysession”,
sessions.Default(c)//设置过期时间session.Options(sessions.Options{MaxAge:
6hrs})//设置Sessionsession.Set(username,
通过session.Get读取session值username
session.Get(username)c.JSON(200,
如果我们想将session数据保存到redis中只要将session的存储引擎改成redis即可。
github.com/gin-contrib/sessions/redis
“github.com/gin-contrib/sessions”
“github.com/gin-contrib/sessions/redis”
r.Use(sessions.Sessions(“mysession”,
sessions.Default(c)session.Set(username,
通过session.Get读取session值username
session.Get(username)c.JSON(200,
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback