Golng gin 框架

    1

🖥️golang gin 框架,我带你啊🚁

IDE 工具 GoLand

https://uain.cc/archives/BHfFnn6b

🗂️新建文件夹

新建 🏚️ginapp 目录

cd ginapp
go mod init
go mod tidy

在🏚️ginapp目录下新建🏚️config目录,并创建📄config.yaml文件与📄config.go文件

💡viper

Viper是适用于Go应用程序的完整配置解决方案。

😀安装

go get github.com/spf13/viper

📄config.yaml

主要是放📦️mariadb/📦️mysql与📦️redis数据库的连接配置信息,当然是推荐用📦️mariadb数据库喽

📄config.toml

[app]
name = "GinApp"
port = ""

[database]
dsn = "root:root@tcp(192.168.0.168:3306)/gin?charset=utf8mb4&parseTime=True&loc=Local"
MaxIdleConns = 11
MaxOpenCons = 114

[redis]
addr = "localhost:6379"
DB = 0
Password = ""

📄config.go

使用📰go读取📄config.yaml文件的代码

📄config.go

package config

import (
	"github.com/spf13/viper"
	"log"
)

// 定义配置文件的结构体
type Config struct {
	App struct {
		Name string
		Port string
	}
	Database struct {
		Dsn          string
		MaxIdleConns int
		MaxOpenConns int
	}
	Redis struct {
		Addr     string
		DB       int
		Password string
	}
}

// 结构体变量
var AppConfig *Config

// 开始使用viper
func InitConfig() {
	viper.SetConfigName("config")
	viper.SetConfigType("toml")
	viper.AddConfigPath("./config")
    viper.SetDefault("app.port", ":8080")

	if err := viper.ReadInConfig(); err != nil {
		log.Fatalf("Error reading config file: %v", err)
	}

	AppConfig = &Config{}

	if err := viper.Unmarshal(AppConfig); err != nil {
		log.Fatalf("Unable to decode into struct: %v", err)
	}
}

🖥️main.go

在🏚️ginapp目录下新建📄main.go文件,作为项目的入口

📄main.go

package main

import (
	"fmt"
	"ginapp/config"
)

func main() {
	config.InitConfig()
	fmt.Println(config.AppConfig.App.Port)
}
go run .
# 可以看到输出了对应的端口变量值

编辑时间 2024/10/19 先玩游戏一会儿吧

💡Gin

Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点

对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错

  1. 📥️Go命令安装Gin(需要1.10+版本)

go get -u github.com/gin-gonic/gin

  1. 📥️导入代码中

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

  1. 📥️(可选)导入net/http。使用http.StatusOK代替状态码

import "net/http"

📄main.go

package main

import (
	"ginapp/config"
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	config.InitConfig()

	// 初始化gin,生成一个g引擎
	g := gin.Default()
	// get方法, / 路由地址,返回http.StatusOK 200,字符串
	g.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "hello world")
	})
	// 启动gin 并绑定配置文件的端口信息
	g.Run(config.AppConfig.App.Port)
}

🔢返回 JSON

定义一个指定返回📄json数据格式的结构体,并初始化

📄main.go

package main

import (
	"ginapp/config"
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	config.InitConfig()

	// 定义返回JSON结构体
	type Info struct {
		Msg string
	}

	info := Info{
		Msg: "hello world",
	}

	// 初始化gin,生成一个g引擎
	g := gin.Default()
	// get方法, info 路由地址,返回http.StatusOK 200,结构体
	g.GET("/info", func(c *gin.Context) {
		c.JSON(http.StatusOK, info)
	})
	// 启动gin 并绑定配置文件的端口信息
	g.Run(config.AppConfig.App.Port)
}

🗂️route 路由分组

将📄main.go中的路由,返回函数分离出来

新建 🏚️route 目录,在 🏚️route 目录下新建 📄route.go 文件

📄route.go

package route

import (
	"ginapp/controller"
	"github.com/gin-gonic/gin"
)

func SetupRoute() *gin.Engine {
	r := gin.Default()

	// auth 路由组,其中路由都由/api/auth开始
	auth := r.Group("/api/auth")
	{
		// 路由 /api/auth/login,并返回controller中的Login函数
		auth.POST("/login", controller.Login)
		// 路由 /api/auth/register,并返回controller中的Register函数
		auth.POST("/register", controller.Register)
	}
	
	// 返回 r 给 main.go
	return r
}

新建 🏚️controller 目录,在 🏚️controller 目录下新建 📄auth.go 文件为auth路由组的函数

📄auth.go

package controller

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

// 路由 /api/auth/register,返回此函数
func Register(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "Register success",
	})
}

// 路由 /api/auth/login,返回此函数
func Login(c *gin.Context) {
	// gin.H 是gin中的键值字典
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "Login success",
	})
}

此时 📄main.go 应修改直接实例化📄route

📄main.go

package main

import (
	"ginapp/config"
	"ginapp/route"
)

func main() {
	config.InitConfig()

	r := route.SetupRoute()

	// 防止配置中端口未设置,使用 8080 作为默认端口
	port := config.AppConfig.App.Port
	if port == "" {
		port = ":8080"
	}
	// 启动gin 并绑定配置文件的端口信息
	if err := r.Run(port); err != nil {
		panic(err)
	}
}

Apipost 接口调试工具

https://www.apipost.cn/download.html

编辑时间 2024/10/20 先玩游戏一会儿吧

💡Gorm

The fantastic ORM library for Golang

就是连接数据库用的😀

https://gorm.io/zh_CN/docs/

😀安装

go get -u gorm.io/gorm

新建 🏚️global 目录,在此目录下新建 📄global.go 文件,用于存放全局变量信息

📄global.go

package global

import "gorm.io/gorm"

var (
	DB *gorm.DB
)

在🏚️config目录下新建📄db.go文件,用于连接数据库

📄db.go

package config

import (
	"ginapp/global"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"log"
	"time"
)

func InitMariaDB() {
	dsn := AppConfig.Database.Dsn
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("Failed to initialize database, got error: %v", err)
	}

	maridbDB, err := db.DB()

	maridbDB.SetMaxIdleConns(AppConfig.Database.MaxIdleConns)
	maridbDB.SetMaxOpenConns(AppConfig.Database.MaxOpenConns)
	maridbDB.SetConnMaxLifetime(time.Hour)

	if err != nil {
		log.Fatalf("Failed to configure database, got error: %v", err)
	}

	global.DB = db
}

新建 🏚️models 目录,在此目录下新建 📄user.go 文件,作为“用户数据表”

📄user.go

package models

import "gorm.io/gorm"

type User struct {
	gorm.Model
	Username string `gorm:"unique"`
	Password string
} 

📄config.go 新增📝InitMariaDB()

package config

import (
	"github.com/spf13/viper"
	"log"
)

// 定义配置文件的结构体
type Config struct {
	App struct {
		Name string
		Port string
	}
	Database struct {
		Dsn          string
		MaxIdleConns int
		MaxOpenConns int
	}
	Redis struct {
		Addr     string
		DB       int
		Password string
	}
}

// 结构体变量
var AppConfig *Config

// 开始使用viper
func InitConfig() {
	viper.SetConfigName("config")
	viper.SetConfigType("toml")
	viper.AddConfigPath("./config")
	viper.SetDefault("app.port", ":8080")

	if err := viper.ReadInConfig(); err != nil {
		log.Fatalf("Error reading config file: %v", err)
	}

	AppConfig = &Config{}

	if err := viper.Unmarshal(AppConfig); err != nil {
		log.Fatalf("Unable to decode into struct: %v", err)
	}

	// 初始化数据库
	InitMariaDB()
}

📦️数据库模型

📦️GORM提供了一个预定义的结构体,名为gorm.Model,其中包含常用字段:

// gorm.Model 的定义
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

包含的字段:

  • 📌ID :每个记录的唯一标识符(主键)。

  • 📌CreatedAt :在创建记录时自动设置为当前时间。

  • 📌UpdatedAt:每当记录更新时,自动更新为当前时间。

  • 📌DeletedAt:用于软删除(将记录标记为已删除,而实际上并未从数据库中删除)

编辑时间 2024/10/22 先玩游戏一会儿吧

💾先保存吧,学类了 打游戏休息一下

消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息