golang mysql封装_golang如何封装路由

e3acab1d3cdb2adae340cce0d960e3fb.png

封装方式一、路由写在 main函数中,数据库初始连接放在 init() 函数中。、

3aae16527c168a9737abda02cf53147a.png

首先看 main.go

一个初始化函数,初始化 dbfunc init() {

db.Connect()

}

第二,路由func main() {

// Configure

router := gin.Default()

// Set html render options

htmlRender := GinHTMLRender.New()

htmlRender.Debug = gin.IsDebugging()

htmlRender.Layout = "layouts/default"

// htmlRender.TemplatesDir = "templates/" // default

// htmlRender.Ext = ".html" // default

// Tell gin to use our html render

router.HTMLRender = htmlRender.Create()

router.RedirectTrailingSlash = true

router.RedirectFixedPath = true

// Middlewares

router.Use(middlewares.Connect)

router.Use(middlewares.ErrorHandler)

// Statics

router.Static("/public", "./public")

// Routes

router.GET("/", func(c *gin.Context) {

c.Redirect(http.StatusMovedPermanently, "/articles")

})

// Articles

router.GET("/new", articles.New)

router.GET("/articles/:_id", articles.Edit)

router.GET("/articles", articles.List)

router.POST("/articles", articles.Create)

router.POST("/articles/:_id", articles.Update)

router.POST("/delete/articles/:_id", articles.Delete)

// Start listening

port := Port

if len(os.Getenv("PORT")) > 0 {

port = os.Getenv("PORT")

}

router.Run(":" + port)

}

封装方式二、路由和 db单独封装到一个函数中,以传参的形式将路由传给另一个函数。

d6205002a0661659971b583532e09723.pngfunc SetUpServer() {

r := gin.Default()

// secret 相当于签名

store, _ := sessions.NewRedisStore(10, "tcp", CONFIG.Redis.Host, CONFIG.Redis.Password, []byte(CONFIG.Server.Secret))

r.Use(sessions.Sessions("session", store))

r.Use(gin.Recovery())

r.Use(Uniquify())

r.LoadHTMLGlob("templates/*")

r.Static("/static", "public/")

SetUpRoutes(r)

r.GET("/incr", func(c *gin.Context) {

c.JSON(200, gin.H{"count": c.MustGet("key").(string)})

})

// var port string

r.Run(":" + CONFIG.Server.Port)

}

封装三、将路由等封装到 Server struct 中。对此 Server 创建一个 new函数,路由等相关内容只包含在方法中。

1db91fac17fbd5acd1816a9486f326dc.pngtype Server struct {

Ws *melody.Melody

Routes *gin.Engine

Games []*Game

}

func New() *Server {

ws := melody.New()

routes := gin.Default()

games := make([]*Game, 0)

return &Server{

Ws: ws,

Routes: routes,

Games: games,

}

}

...

...

func (srv *Server) RoutesInit() {

srv.Routes.GET("/jq.js", func(c *gin.Context) {

http.ServeFile(c.Writer, c.Request, "html/jq.js")

})

srv.Routes.GET("/goyaniv.js", func(c *gin.Context) {

http.ServeFile(c.Writer, c.Request, "html/goyaniv.js")

})

srv.Routes.GET("/game/:name", func(c *gin.Context) {

cookiekey, _ := c.Request.Cookie("goyanivkey")

cookieid, _ := c.Request.Cookie("goyanivid")

if cookieid == nil || cookiekey == nil {

cookieid := CreateCookie("goyanivkey", GenerateUnique())

cookiekey := CreateCookie("goyanivid", GenerateUnique())

http.SetCookie(c.Writer, cookieid)

http.SetCookie(c.Writer, cookiekey)

}

http.ServeFile(c.Writer, c.Request, "html/game.html")

})

srv.Routes.GET("/gamedev/:name", func(c *gin.Context) {

cookiekey, _ := c.Request.Cookie("goyanivkey")

cookieid, _ := c.Request.Cookie("goyanivid")

if cookieid == nil || cookiekey == nil {

cookieid := CreateCookie("goyanivkey", GenerateUnique())

cookiekey := CreateCookie("goyanivid", GenerateUnique())

http.SetCookie(c.Writer, cookieid)

http.SetCookie(c.Writer, cookiekey)

}

http.ServeFile(c.Writer, c.Request, "html/gamedev.html")

})

srv.Routes.GET("/game/:name/ws", func(c *gin.Context) {

srv.Ws.HandleRequest(c.Writer, c.Request)

})

srv.Routes.GET("/gamedev/:name/ws", func(c *gin.Context) {

srv.Ws.HandleRequest(c.Writer, c.Request)

})

srv.Ws.HandleMessage(func(s *melody.Session, msg []byte) {

FireMessage(srv, s, msg)

})

srv.Ws.HandleDisconnect(func(s *melody.Session) {

FireDisconnect(srv, s)

})

srv.Ws.HandleConnect(func(s *melody.Session) {

FireConnect(srv, s)

})

}

func (s *Server) Run() {

s.RoutesInit()

s.Routes.Run(":5000")

}

更多golang知识请关注PHP中文网golang教程栏目。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在java继承机制中 父类中的私有_Java中子类能继承父类的私有属性吗?

前段时间去听老师讲课的时候,老师告诉我子类是可以继承父类所有的属性和方法的。当时我是极其疑惑的,因为之前学校考试时这个考点我记得很清楚:子类只能继承父类的非私有属性和方法。老师给我的解释是这样的——先看下面一段代码/*** 定义父类…

堆栈关系java_从关键字说Java对象、引用、指针、堆栈的关系

前言:上一篇中我们介绍了new关键字 点击打开链接,new一个类,实际上就是调用该类的构造函数,返回该类的对象。如a new Animal();返回的对象赋给变量a。我们来分析一下内存分配的步骤,new一个类,实际上就创造…

java socket编程客户端_Java Socket编程 - 基于Socket实现HTTP下载客户端

没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客户端。完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送如何从Socket中接受HTTP响应(Response header, Response body)报文并解析与保存文件内容。如何通过SwingWork实…

java读c二进制文件_如何使用JAVA读取C / Matlab创建的二进制文件

小编典典正如我所猜测的那样,这是一个字节序问题,即您的二进制文件被写为低字节序的整数(可能是因为您使用的是Intel或类似的CPU)。但是,无论Java代码运行在哪个CPU上,它都在读取大端整数。为了显示该问题,以下代码将读…

java 通联支付接口_allinpay 通联支付接口实例

【实例简介】allinpay 支付的实例代码,这只是部分,需要其它的请联系我。 帮忙找【实例截图】【核心代码】201708081652114811└── unionorder_demo├── java│ └── uniondemo│ ├── WebContent│ │ ├── META-INF│ │ │ └…

java web tcp长连接超时时间_常用java web容器http长连接超时设置

1.http长连接相关知识http长连接对我们来说并不陌生,但长连接并不是永远不会关闭。对于HTTP长连接需要注意下面几点:keepalive_timeout指的是web服务器发送完最后一个响应报文后,开始计时,如果在keepalive_timeout指定的时间内还没…

java相遇问题_行程问题

行程问题 《行程问题》说课设计——现代教育信息技术与数学学科的整合福建省闽侯县尚干中心小学 林惠贞 邮编:350112 邮箱:zhenzi2277163.com众所周知,未来的教育,倡导开放式学习,把学习的地点扩展到社会、网络&…

jbutton 数组创建 java_java-将JButton数组添加到JPanel(按钮不可见)

我正在尝试使用Java创建一个简单的计算器.为此,我创建了一个JButton数组并将其添加到JPanel中.问题:按钮不可见.我还添加了一个JLabel和一个JButton进行测试,它们可以正确显示.编码:package test;import java.awt.BorderLayout;import javax.swing.*;pub…

jwt java 项目实例_JWT(JsonWebToken)+SpringMVC项目demo

【实例简介】JSON Web Token(JWT)是一个非常轻巧的规范。现在免费给大家分享一个JWT(JsonWebToken)SpringMVC项目的demo!【实例截图】【核心代码】jwt-demo└── jwt-demo├── pom.xml├── src│ └── main│ ├── java│ │ └── com│ │ └── hthl…

java写一个99到0_Java中一个普通的循环为何从10开始到99连续相乘会得到0?

【套装4本】java编程思想4第4版402.5元包邮(需用券)去购买 >这是一块非常简单的Java代码片段&#xff1a;public class HelloWorld{public static void main(String []args){int product 1;for (int i 10; i < 99; i) {product * i;}System.out.println(product);}}为什…

neo4j java查找_Spring-Boot使用neo4j-java-driver-- 查找两个节点之间关系的最短路径

一、Cypher数据create (小北:朋友圈{姓名:"小北", 喜欢的书类:"Poetry"}),(小菲:朋友圈{姓名:"小菲", 喜欢的书类:"Science Fiction"}),(小鹏:朋友圈{姓名:"小鹏", 喜欢的书类:"Music"}),(小颖:朋友圈{姓名:"…

java 返回两个集合_使用 java stream 获取两个集合之间的交集.差集

原始对象List hrProbationMainList new ArrayList();List hrProbationMains probationMainDao.findAll();获取交集对象stream 转换成流 (只有变成流才能操作)filter 封装判断条件(如果true 则收集到结果中,false则不收集)collect 收集结果返回到指定类型中//交集对象ListhrPro…

java重写重定向_JavaWeb请求转发与请求重定向理解

请求转发使用方法httpServletRequest.getRequestDispatcher("login.jsp").forward(httpServletRequest, servletresponse);此请求过程 完全是一次request对象 完成的。我们可以用 filter 截取用户的这次请求&#xff0c;然后利用这次请求 访问其它页面&#xff0c;当…

autojs调用java识字_autojs实现抽象类的继承

作者: 牙叔使用情景在java中, 抽象类必须继承才能使用, 那么在autojs中怎样实现继承抽象类呢?java中的实现创建一个抽象类package com.yashu;public abstract class Employee{ private String name; private String address; private int number; public abstract double com…

java wix_使用WIX升级MSI

我正在使用WIX创建一个MSI安装程序 . 一切都很好&#xff0c;我能够创建自己的产品并创造一切 .但是&#xff0c;当我想要创建升级时&#xff0c;它无法正常工作 .我使用了以下代码&#xff0c;其中$(var.ProductUpgradeCode)被定义并用作product元素中的upgrade-code .Minimum…

继承易错总结

1.继承会将所有的成员继承下来&#xff0c;但是继承方式限定的是继承下来成员的可见类型(如果是private继承&#xff0c;那么他不论哪里都是不可见的&#xff1b;如果是protected继承在类中是可见的&#xff0c;在类外是不可见的&#xff1b;如果是public继承&#xff0c;在任何…

flat在java中的含义_Java 9中Collectors.flatMapping()方法的重要性?

在Java 9中&#xff0c;向Collectors类添加了一个新方法&#xff1a;flatMapping()。它类似于Collectors.mapping()方法&#xff0c;其中flatMapping()方法允许我们处理嵌套的集合。 Collectors.flatMapping()方法需要的功能将被施加到输入元件和集电极积累通过功能传递的元件。…

hhkb适合写java吗_起底这届HHKB最强新品键盘,究竟好在哪儿?

2019年12月HHKB上市了3大品类的12款新品键盘&#xff0c;今天为大家分享外设天下为HHKB Professional HYBIRD Type-S 双模静音旗舰版静电容键盘做的评测&#xff0c;起底这届HHKB新品的最强新品。近日&#xff0c;HHKB更新了旗下的在售产品系列&#xff0c;为了满足严肃、安静办…

java暂停5s_java如何实现继续/暂停按钮

匿名用户1级2016-11-24 回答很简单&#xff0c;我给你写一个Demo&#xff1a;import java.awt.event.*;import javax.swing.*;public class Demo extends Thread {private JFrame frm new JFrame("Demo");private JButton btnPause new JButton("Pause")…

c mysql数据库_C实现MySQL数据库操作

C实现MySQL数据库操作两个月前&#xff0c;也就是9月份&#xff0c;心血来潮在windows下实现了用C连接数据库&#xff0c;当时很是有把linux下一并给实现了。但是没有想得那么简单。这个任务一直推迟到了现在才完成&#xff0c;究其原因&#xff1a;1.我直接用eclipse开发工具&…