Gin开发03

前端之家收集整理的这篇文章主要介绍了Gin开发03前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Gin开发-3

这一篇文章开始,着手编写一个Gin Web System内容包含:
后台服务:
1. Markdown文件渲染为Blog,支持标签分类等定义和评论
2. 在线API服务,提供付费音乐下载&视频VIP解析接口。提供Blog管理API。
3. 分享模块。提供软件下载和介绍等。(一般功能,可以用1替代)
4. 文件管理。使用SSH或者KO管理。

前台展示:
1. 服务器端[Web]。UIKIT+jQuery,提供页面
2. 客户端[App]。UIKIT+Electron制作客户端。
3. 远程管理[Web]。syncthing同步。webconsole提供Web SSH。

项目架构

工程目录结构

.
├── data
│ ├── blogs
│ └── config.ini
├── src
├── main.go
├── statics
│ ├── css
│ ├── images
│ └── js
└── templates
    └── blog

最终形态如上,src是核心代码,main.go是程序入口。其他目录与最终的exe共同组成可执行项目。

基础代码

// main.go
package main

import (
    @H_301_41@"fmt"
    @H_301_41@"gindemo1/engine"
)

var (
    App_Version = @H_301_41@"R1.0"
)

func main() {
    fmt.Println(@H_301_41@"Gin Web System:",App_Version)
    fmt.Println(@H_301_41@"Load Config...")
    fmt.Println(@H_301_41@"Start Blog Server...")
    fmt.Println(@H_301_41@"Start API Server...")
    engine.Run()
}

// engine/main.go
package engine

import (
    @H_301_41@"net/http"

    @H_301_41@"github.com/gin-gonic/gin"
)

var (
    AppEngine *gin.Engine = nil
)

func init() {
    AppEngine = gin.Default()
    // favicon.ico
    AppEngine.StaticFile(@H_301_41@"/favicon.ico",@H_301_41@"./statics/favicon.ico")
    // statics
    AppEngine.Static(@H_301_41@"/statics",@H_301_41@"./statics")
}

func Run() {
    // urls
    AppEngine.GET(@H_301_41@"/",func(c *gin.Context) {
        c.Header(@H_301_41@"Content-Type",@H_301_41@"text/html; charset=utf-8")
        c.String(http.StatusOK,@H_301_41@"<h1>%v</h1>",@H_301_41@"Hello")
    })
    AppEngine.GET(@H_301_41@"/ping",@H_301_41@"application/json; charset=utf-8")
        c.JSON(http.StatusOK,gin.H{@H_301_41@"msg": @H_301_41@"dong"})
    })
    AppEngine.Run(@H_301_41@":8090")
}

Blog模块

Blog模块核心功能是提供MD文档的解析和渲染。
1. 枚举制定目录下的文件夹和文件,将类别和标签暂存到内存。
2. 访问网页时,渲染MD内容到Web。
3. 提供评论功能
4. 提供API访问能力。

见项目 GinWebSystem

坑记录

Gin路由支持

它按照树形结构进行路径匹配,所以,有一些匹配规则无法实现,比如:

// 无法匹配的场景
/api/:tag/list
/api/:tag/view

// 只能这种的
/api/list/:tag
/api/view/:tag

所以,它支持前导匹配,更无法显示正则匹配一类的功能。也由于这个限制,它的路由性能很好,有舍有得吧。

Gin模版

模版本身限制很严,通过template使用的块,必须在其他文件中define,否则编译不通过。还有,文件模版不像Django一类的一样,多个同时使用,必须手工指定名字和对应的文件

还有,在模版中使用参数,有一些必须注意的事项:

// 下面的 md_tag 会提示找不到的错误
{{rang $k,$v := items}}
    <div>{{ .md_tag }}</div> // 假设 md_tag 通过模版传递过来的变量 {{end}} // 变通做法 {{ $tag := .md_tag }} {{rang $k,$v := items}} <div>{{ $tag }}</div> // 假设 md_tag 通过模版传递过来的变量
{{end}}

即,使用range和with时,无法使用模版传递过来的变量,必须等待end或者声明其他变量传递。

基础功能

没有配置文件管理,db管理…
只有简单路由、基本的参数解析、基本的模版功能。相当简陋(优点?)。

总结

Gin作为一个中规中矩的Web框架,完成了很多基础的功能,也有它的“弊端”,但是不失为一个优秀的学习对象。还有如Beego、Echo…也是各有利弊,没有所谓的最好的,框架都差不多,够用就好,需要理性看待。

猜你在找的Go相关文章