Golng gin 框架
🖥️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足够简单,性能也非常不错
📥️Go命令安装Gin(需要1.10+版本)
go get -u github.com/gin-gonic/gin
📥️导入代码中
import "github.com/gin-gonic/gin"
📥️(可选)导入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 接口调试工具
编辑时间 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 先玩游戏一会儿吧
💾先保存吧,学类了 打游戏休息一下