api开发
├── conf #项目配置文件目录
│ └── config.yaml #例如:toml、yaml等等
├── controllers #控制器目录
│ └── IndexController.go
├── models #模型目录
│ ├── AppModel.go
│ └── UserModel.go
├── routes #路由目录
│ └── routes.go
├── logs #日志文件目录,保存项目运行过程中产生的日志。
├── main.go #项目入口
├── README.md
├── .gitignore
如果需要视图加上views
和static
这两个目录
├── static #静态资源目录
│ ├── css
│ ├── images
│ └── js
├── views #视图模板目录
│ └── index.html
#创建项目目录
mkdir gin_demo
#初始化项目
go mod init gin_demo
#安装gin框架
go get -u github.com/gin-gonic/gin
main.go
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.GET("/", func(ctx *gin.Context) {
ctx.JSON(200, gin.H{
"code": 0,
"msg": "ok",
})
})
router.Run(":5000")
}
go run main.go
运行项目,浏览器访问路径:127.0.0.1:5000
models/mysql.go
package models
import (
"gin_demo/config"
"log"
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// 数据库初始化
var DB *gorm.DB
func InitMysql() {
dsn := config.Confok.Database.Mysql
// log.Printf("dsn--------------------: %v\n", config.Confok.Database)
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Println("打开mysql失败,", err)
}
DB = d
sqlDB, _ := DB.DB()
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(config.Confok.Database.MaxIdleConns)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(config.Confok.Database.MaxOpenConns)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)
}
routes/routes.go
package routes
import (
"gin_demo/controllers"
"github.com/gin-gonic/gin"
)
func RegisterRoute(r *gin.Engine) {
r.GET("/hello", controllers.Hello)
}
models/UserModel.go
package models
// ES索引
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
//通过user_id查询用户
func GetUserByID(user_id int) (user User) {
DB.Debug().First(&user, user_id)
return user
}
controllers\IndexController.go
package controllers
import (
"github.com/gin-gonic/gin"
)
func Hello(ctx *gin.Context) {
ctx.JSON(200, gin.H{
"code": 0,
"msg": "ok",
})
}
config/config.go
使用了yaml
作为配置文件
package config
import (
"fmt"
"io/ioutil"
"log"
"gopkg.in/yaml.v2"
)
// 配置文件
type Conf struct {
Database Database `yaml:"database"`
Es Es `yaml:"es"`
}
type Database struct {
Mysql string `yaml:"mysql"`
MaxIdleConns int `yaml:"max_idle_conns"`
MaxOpenConns int `yaml:"max_open_conns"`
}
type Es struct {
Host []string `yaml:"host"`
User string `yaml:"user"`
Pwd string `yaml:"pwd"`
}
var Confok Conf
// 获取配置文件方法
func InitConf() {
yamlFile, err := ioutil.ReadFile("./config.yaml")
if err != nil {
fmt.Println(err.Error())
}
err = yaml.Unmarshal(yamlFile, &Confok)
if err != nil {
fmt.Println(err.Error())
}
log.Println("配置文件初始化...")
}
main.go
package main
import (
"fmt"
"gin_demo/config"
"gin_demo/models"
"gin_demo/routes"
"io"
"log"
"os"
"github.com/gin-gonic/gin"
)
// 日志
func init() {
logFile, err := os.OpenFile("./log.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
fmt.Println("打开日志文件失败, err:", err)
return
}
multiWriter := io.MultiWriter(os.Stdout, logFile)
log.SetOutput(multiWriter)
}
func main() {
config.InitConf() //初始化配置文件
models.InitMysql() //初始化数据库
//路由
r := gin.Default()
routes.RegisterRoute(r)
r.Run(":5000")
}