0x0 Gin简介

1.Gin 是什么?

Gin 是一个用 Go (Golang) 编写的 HTTP web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍。如果你需要极好的性能,使用 Gin 吧。

2.Gin相关地址

doc:https://gin-gonic.com/zh-cn/docs/

github:https://github.com/gin-gonic/gin

0x1 快速开始

1. 用module模式创建工程

mkdir web_api

cd web_api

go mod init web_api

2.创建main.go

import "github.com/gin-gonic/gin"

func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}

3. 运行

go run main.go

4. 浏览器打开 127.0.0.1:8080/ping

0x2 实践

1. 说明

1)这是一个简单的例子,实现了通过id查找数据库获取用户名字的功能。

2)使用了MVC结构,当然也可以不套用这种结构。好处就是开发web程序结构会清晰很多。

3)使用了go modules的包管理方式确实方便很多。不清楚的可以看我另外一篇关于go modules的介绍https://www.cnblogs.com/mrblue/p/11277100.html

4)依赖了yml和gorm库

2.目录结构如下

│ config.yml
│ go.mod
│ go.sum
│ main.go
│ Makefile
│ README.md
├─app
│    app.go
│    handle.go
│    routers.go

├─controllers
│    user.go

├─models
│   model.go
│   user.go

├─routers
│   router.go

└─service
    user.go

3.主要文件说明

1)app/app.go 应用程序文件,负责初始化gin上下文,处理信号量

package app

import (
"context"
"log"
"net/http"
"os"
"os/signal"
"time"
"web_api/routers"
"github.com/gin-gonic/gin"
) type Config struct {
Port string
Debug bool
} func Run(cfg Config) {
router := gin.Default()
routes.RegisterRouters(router)
srv := &http.Server{
Addr: ":" + cfg.Port,
Handler: router,
} go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
}
}() quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
<-quit
log.Println("Shutdown Server ...") ctx, cancel := context.WithTimeout(context.Background(), *time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Server Shutdown:", err)
}
}

2) controllers/user.go 控制文件,获取请求参数,调用service的逻辑方法,然后返回结果

package controllers

import (
"net/http" "web_api/service" "github.com/gin-gonic/gin"
) func GetName(c *gin.Context) { id := c.Param("id")
r := service.User{ID: id}
name, err := r.GetName()
if nil != err {
c.String(http.StatusInternalServerError, err.Error())
return
} c.JSON(http.StatusOK, gin.H{"error": "ok", "name": name})
}

3) models/model.go 数据库的初始化

package models

import (
"fmt" "github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
) // Config 配置
type Config struct {
User string
Password string
Host string
Name string
} var (
db *gorm.DB
) // Setup initializes the database instance
func Setup(cfg Config) error { var err error
db, err = gorm.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
cfg.User,
cfg.Password,
cfg.Host,
cfg.Name)) if err != nil {
return err
} db.SingularTable(true)
db.DB().SetMaxIdleConns()
db.DB().SetMaxOpenConns()
return nil
} // CloseDB closes database connection (unnecessary)
func CloseDB() {
defer db.Close()
}

4) models/user.go user数据库表的增删改查

package models

import (
"github.com/jinzhu/gorm"
) type User struct {
ID string `gorm:"primary_key;type:INT(20)"`
Age int32 `gorm:"type:INT(20)"`
Name string `gorm:"type:VARCHAR(256)"`
Desc string `gorm:"type:VARCHAR(256)"`
}

  func (User) TableName() string {
    return "user"
  }

func GetUser(id string) (*User, error) {
u := &User{
ID: id,
}
err := db.First(u).Error
if err != nil && err != gorm.ErrRecordNotFound {
return nil, err
} return u, nil
}

5) routers/router.go 定义路由

package routers

import (
"web_api/controllers" "github.com/gin-gonic/gin"
) // RegisterRouters ...
func RegisterRouters(g *gin.Engine) {
g.GET("/name/:id", controllers.GetName)
}

6) service/user.go user的逻辑

package service

import (
"web_api/models"
) type User struct {
ID string
} func (r *User) GetName() (string, error) {
u, err := models.GetUser(r.ID)
if nil != err {
return "", err
}
return u.Name, nil
}

7) main.go

package main

import (
"flag"
"io/ioutil"
"log" "web_api/app"
"web_api/models" "gopkg.in/yaml.v2"
) // Config 配置
type Config struct {
App app.Config
Model models.Config
} var (
cfgPath = flag.String("config", "config.yml", "config file path")
) func main() {
cfg := Config{}
if data, err := ioutil.ReadFile(*cfgPath); nil != err {
panic(err)
} else {
if err := yaml.Unmarshal(data, &cfg); nil != err {
panic(err)
}
} if err := models.Setup(cfg.Model); nil != err {
panic(err)
} app.Run(cfg.App) log.Println("Server exiting")
}

4.配置文件 confg.yml

app:
port:
debug: true model:
user: root
password: xxxxx
host: 127.0.0.1:
name: mydb

5.测试

1)需要你的mysql有个叫mydb的库,里有一张叫user的表

2)查找id魏1000的人的名字,浏览器打开 http://127.0.0.1:8080/name/1000

[Golang] Gin框架学习笔记的更多相关文章

  1. 前端程序员学习 Golang gin 框架实战笔记之一开始玩 gin

    原文链接 我是一名五六年经验的前端程序员,现在准备学习一下 Golang 的后端框架 gin. 以下是我的学习实战经验,记录下来,供大家参考. https://github.com/gin-gonic ...

  2. Golang gin框架学习

    今天开始学习gin框架,在Github上找的示例的go-gin-example, 进度 日期 进展 疑惑 进展 1.30 下拉代码,初步了解gin的介绍.搭建 .mod文件 module原理.使用方法 ...

  3. kratos微服务框架学习笔记一(kratos-demo)

    目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了,没怎么更博和githu ...

  4. golang(gin框架),基于RESTFUL的跨语言远程通信尝试

    golang(gin框架),基于RESTFUL的跨语言远程通信尝试 背景: 在今年的项目实训过程中,遇到了这样的问题: 企业老师讲课实用的技术栈是Java springboot. 实训实际给我们讲课以 ...

  5. phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 http://www.qixing318.com/article/phalcon-framework-to-study-notes.html 目录结构   pha ...

  6. Yii框架学习笔记(二)将html前端模板整合到框架中

    选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/ ...

  7. JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

  8. JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

    前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...

  9. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

随机推荐

  1. python 验证码识别示例(四) 简单验证码识别

    今天介绍一个简单验证的识别. 主要是标准的格式,没有扭曲和变现.就用 pytesseract 去识别一下. 验证码地址:http://wsxf.mca.gov.cn/zfp/Random.cmd?d= ...

  2. 《快活帮》第八次团队作业:Alpha冲刺

    项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十二 团队作业8-软件测试与ALPHA冲刺 团队名称 快活帮 作业学习目标 (1)掌握 ...

  3. 网页禁止右键,禁止F12,禁止选中,禁止复制,禁止缓存等操作

    一.禁止右键 //方法一 document.onmousedown = function () { ) { return false; } } //方法二 document.oncontextmenu ...

  4. 滚动加载|页面滑到底部加载数据|jquery.endless-scroll插件|使用demo

    <html> <head> <link rel="dns-prefetch" href="http://i.tq121.com.cn&quo ...

  5. Spring AOP中JoinPoint的用法

    Spring JoinPoint的用法 JoinPoint 对象 JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的 ...

  6. Optional类的基本使用(没怎么看)

    参考:https://www.runoob.com/java/java8-optional-class.html java8中引入了一个新类:Optional,用于日常编码中对空指针异常进行限制和处理 ...

  7. Blink示例程序

    打开Arduino IDE(话说与Processing IDE的UI好像啊 然后将这段代码输入.也可从文件>例子>01.Basics/Blink(File/Examples/01.Basi ...

  8. uni验证码60秒倒计时

    其实要实现这个功能原理非常简单,就是setInterval+setTimeout+clearInterval结合使用,首先在data里定义一个变量second,初始值为60,然后在setInterva ...

  9. cratedb 做为prometheus 的后端存储

    prometheus 提供了remote_write 以及remote_read 的数据存储方式,可以帮助我们进行数据的长时间存储.方便查询 cratedb 提供了对应的adapter,可以直接进行适 ...

  10. 第04组alpha冲刺(3/4)

    队名:斗地组 组长博客:地址 作业博客:Alpha冲刺(3/4) 各组员情况 林涛(组长) 过去两天完成了哪些任务: 1.收集各个组员的进度 2.写博客 展示GitHub当日代码/文档签入记录: 接下 ...