gin框架搭建 | 青训营笔记

296 阅读3分钟

Gin是一个用Go语言编写的web框架,它是一个类似于martini但拥有更好性能的API框架,由于使用了httprouter,速度提高了近40倍。

Gin的特点如下:

  1. 路由速度快: Gin采用了radix树算法,使得路由的速度非常快。在处理大量请求时,Gin仍然能够保持响应迅速。

  2. 中间件支持: Gin支持中间件机制,可以通过中间件实现各种功能,例如日志记录、认证授权、API限流等。

  3. 完备的HTTP处理: Gin提供了完整的HTTP方法,包括GET、POST、PUT、DELETE等,同时还支持自定义HTTP方法。

  4. 支持JSON解析: Gin默认使用JSON作为数据交换格式,提供了非常方便的JSON解析工具。

  5. 高效的参数绑定: Gin支持将请求参数绑定到结构体或者map中,简化了请求参数的处理过程。

  6. 多种渲染模板支持: Gin支持多种渲染模板,包括HTML、JSON、XML等,也可以自定义渲染模板。

  7. 完善的文档: Gin提供了完整的文档和示例代码,易于学习和使用,同时还有活跃的社区支持。

本人先接触的java,学过springboot,然后参加本次青训营才接触到golang的gin框架,现在我来就自己的感觉讲一下这两个框架的区别和共同点。

区别:

  1. 开发语言:Gin框架使用Go编程语言开发,而Spring Boot使用Java编程语言开发。
  2. 性能:由于Go语言的高并发性和轻量级特性,Gin框架在处理大量请求时比Spring Boot更快。
  3. 配置:Spring Boot拥有非常强大的自动化配置功能,可以简化开发人员的工作,而Gin框架则需要手动配置。

共同点:

  1. MVC架构:两者都采用MVC设计模式,将业务逻辑、数据存储和用户界面分离。
  2. RESTful支持:它们都支持RESTful API设计,使得开发人员能够创建基于HTTP协议的API接口。
  3. 开发效率:它们都提供了丰富的工具和库,可以帮助开发者提高开发效率。

总体来说,Gin框架适合需要高性能和并发处理的Web应用程序,而Spring Boot则适合中小型企业级应用程序,因为它提供了更多的开箱即用的功能和更强大的社区支持。

初始化project项目

go mod init project
go mod tidy

GOPROXY:解决 go get golang.org/x 包失败

# 启用 Go Modules 功能
$env:GO111MODULE="on"
# 配置 GOPROXY 环境变量
$env:GOPROXY="https://goproxy.io"

gin框架简化版

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

gin框架架构

1.在main方法里,初始化配置文件 以及 数据库

func main() {
	utils.InitConfig()
	utils.InitMySQL()
	r := router.Router()
	r.Run(":8080") // 监听并在 0.0.0.0:8080 上启动服务
}

2.在config包里编辑app.yaml

mysql:
  dns: "root:root@tcp(127.0.0.1:3306)/ginchat?charset=utf8&parseTime=True&loc=Local"

3.新建utils包 system_init.go

var Db *gorm.DB

func InitConfig() {
	viper.SetConfigName("app")
	viper.AddConfigPath("config")
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("config app:", viper.Get("app"))
	fmt.Println("config mysql:", viper.Get("mysql"))
}

func InitMySQL() *gorm.DB {
	Db, _ = gorm.Open(mysql.Open(viper.GetString("mysql.dns")), &gorm.Config{})
	fmt.Println("MySQL inited ~~~~~~~~~~~~")
	return Db
}

4.到 user_basic.go里加上

func GetUserList() []*UserBasic {
	data := make([]*UserBasic, 10)
	utils.Db.Find(&data)
	for _, v := range data {
		fmt.Println(v)
	}
	return data
}

5.在service包里面新建 userservice.go

func GetUserList(c *gin.Context) {
	data := make([]*models.UserBasic, 10)
	data = models.GetUserList()

	c.JSON(200, gin.H{
		"message": data,
	})
}

6.在router包的app.go

func Router() *gin.Engine {
	r := gin.Default()
	r.GET("/index", service.GetIndex)
	r.GET("/user/getUserList", service.GetUserList)
	return r
}