使用到的第三方庫
- gin Gin 框架
- viper 配置文件管理
- cors 跨域資源請求配置
- gorm ORM 庫
- zap 日志記錄
main 包
Go 語言程序的入口點
main.go 文件
- 使用 flag 讀取配置文件路徑參數(shù),默認當(dāng)前目錄下
- 使用 viper 讀取 config.ini 配置文件初始化初始數(shù)據(jù)
- 初始化隨機數(shù)種子
- 初始化數(shù)據(jù)庫
- 聲明啟動程序模式
- 配置啟動參數(shù)并啟動服務(wù)
package main
import (
"flag"
"log"
"math/rand"
"project/dao"
"project/routers"
"time"
"github.com/gin-gonic/gin"
"github.com/spf13/viper"
)
var (
ServiceHost string
ServicePort string
)
func init() {
var configPath string
flag.StringVar(&configPath, "config-path", ".", "path to config file")
flag.Parse()
viper.SetConfigName("config") // 設(shè)置配置文件名為“config”
viper.SetConfigType("ini") // 設(shè)置配置文件類型為“ini”
viper.AddConfigPath(configPath) // 設(shè)置在configPath中查找配置文件
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
// Config file not found; ignore error if desired
log.Panic("沒有找到配置文件")
} else {
// Config file was found but another error was produced
log.Panic("初始化配置出錯", err.Error())
}
}
ServiceHost = viper.GetString("service.host")
ServicePort = viper.GetString("service.port")
dao.DatabaseUser = viper.GetString("database.user")
dao.DatabasePwd = viper.GetString("database.pwd")
dao.DatabaseHost = viper.GetString("database.host")
dao.DatabasePort = viper.GetString("database.port")
dao.DatabaseName = viper.GetString("database.name")
}
func main() {
rand.Seed(time.Now().Unix())
mode := "release"
err := dao.InitMySQL()
if err != nil {
log.Println("初始化數(shù)據(jù)失敗", err.Error())
return
}
switch mode {
case "debug":
gin.SetMode(gin.DebugMode)
case "release":
gin.SetMode(gin.ReleaseMode)
case "test":
gin.SetMode(gin.TestMode)
}
r := routers.SetupRouter()
s := &http.Server{
Addr: ServiceHost + ":" + ServicePort,
Handler: r,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
}
err = s.ListenAndServe()
if err != nil {
panic(err)
}
}
dao 包
通常被用于數(shù)據(jù)存儲層的實現(xiàn),可將底層數(shù)據(jù)庫訪問操作封裝隱藏細節(jié)以簡化數(shù)據(jù)庫操作
mysql.go 文件
使用 gorm 初始化 MySQL 數(shù)據(jù)庫連接
package dao
import (
"fmt"
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var (
Db *gorm.DB
DatabaseUser string
DatabasePwd string
DatabaseHost string
DatabasePort string
DatabaseName string
)
func InitMySQL() (err error) {
dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=utf8mb4&parseTime=True&loc=Local",
DatabaseUser, DatabasePwd, DatabaseHost, DatabasePort, DatabaseName)
Db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Panic("連接數(shù)據(jù)庫失敗", err.Error())
}
// 測試數(shù)據(jù)庫連接
err = Db.Exec("SELECT 1").Error
if err != nil {
log.Panic("數(shù)據(jù)庫連接失敗", err.Error())
}
return
}
routers 包
通常用于路由器配置,這個包中包含的代碼需要讀取 HTTP 請求并將該請求發(fā)送到相應(yīng)后端的處理程序,然后從處理程序獲取響應(yīng)
routers.go 文件
- 創(chuàng)建日志記錄器
- 初始化 gin 引擎
- 配置 cors 跨域請求
- 設(shè)置一個默認路由,及無請求到路由時返回的數(shù)據(jù)
package routers
import (
"net/http"
"project/controller"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
func SetupRouter() *gin.Engine {
// 創(chuàng)建一個生產(chǎn)級別的日志記錄器
logger, err := zap.NewProduction()
if err != nil {
panic(err)
}
// 在函數(shù)結(jié)束后刷新緩沖區(qū)
defer logger.Sync()
r := gin.Default()
// 將 logger 存儲在 Gin 的中間件中
r.Use(func(c *gin.Context) {
c.Set("logger", logger)
c.Next()
})
r.Use(cors.New(cors.Config{
AllowOrigins: []string{"*"},
AllowMethods: []string{"POST, GET, PUT, DELETE, OPTIONS"},
AllowHeaders: []string{"Content-Type, Content-Length"},
ExposeHeaders: []string{"Access-Control-Allow-Headers"},
AllowCredentials: true,
}))
r.GET("/first", controller.FirstHandler)
// 下面有兩個配置
// 如果將前端服務(wù)與后端服務(wù)同時啟動可以設(shè)置第一種,將前端打包的文件放到 public 文件夾內(nèi)
// 我這里設(shè)置的使用 vite 打包,所以就下面這種設(shè)置,可以自行更改
// 當(dāng)直接訪問的時候,就相當(dāng)于請求"/"路由,就會訪問 index.html 頁面
// 設(shè)置靜態(tài)文件服務(wù)目錄
r.Static("public", "public")
r.Static("assets", "public/assets")
r.GET("/", func(c *gin.Context) {
c.File("public/index.html")
})
r.NoRoute(func(c *gin.Context) {
c.File("public/index.html")
})
// 如果前后端分離模式,可以設(shè)置為請求到?jīng)]有的路由就返回 Not Found
r.NoRoute(func(c *gin.Context) {
c.JSON(http.StatusNotFound, gin.H{
"msg": "Not Found",
})
})
return r
}
controller 包
負責(zé)維護業(yè)務(wù)邏輯的實現(xiàn),同時調(diào)用 Dao 對象實現(xiàn)數(shù)據(jù)存儲、檢索等功能,通常與用戶交互并處理相關(guān)活動
controller.go 文件
- 創(chuàng)建初始默認路由函數(shù),使用 info 級別的日志記錄并返回數(shù)據(jù)
package controller
import (
"net/http"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
func FirstHandler(c *gin.Context) {
c.MustGet("logger").(*zap.Logger).Info("這是一個Info日志")
c.JSON(http.StatusOK, gin.H{
"code": 1,
"data": "Hello World",
"msg": "成功",
})
}
config.ini 文件
外部配置文件文章來源:http://www.zghlxwxcb.cn/news/detail-703311.html
[service]
host=127.0.0.1
port=8000
[database]
user=root
pwd=123456
host=127.0.0.1
port=3306
name=databasename
build.bat 文件
打包腳本,不用每次修改環(huán)境變量,不用手動輸入打包命令
腳本內(nèi)容:修改環(huán)境變量為 arm64 架構(gòu) Linux 系統(tǒng),打包,還原為 amd64 架構(gòu) Windows 系統(tǒng),我這里使用 Windows 做開發(fā),需要部署到 arm64 架構(gòu)的 Linux 服務(wù)器上,所以這樣寫,根據(jù)需要自行更改文章來源地址http://www.zghlxwxcb.cn/news/detail-703311.html
@echo off
go env -w CGO_ENABLED=0
go env -w GOOS=linux
go env -w GOARCH=arm64
go build -ldflags "-w -s"
go env -w CGO_ENABLED=1
go env -w GOOS=windows
go env -w GOARCH=amd64
到了這里,關(guān)于初始化一個Gin框架的Go-Web項目的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!