初始化一个Gin框架的Go-Web项目

这篇具有很好参考价值的文章主要介绍了初始化一个Gin框架的Go-Web项目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用到的第三方库

  • gin Gin 框架
  • viper 配置文件管理
  • cors 跨域资源请求配置
  • gorm ORM 库
  • zap 日志记录

main 包

Go 语言程序的入口点

main.go 文件

  1. 使用 flag 读取配置文件路径参数,默认当前目录下
  2. 使用 viper 读取 config.ini 配置文件初始化初始数据
  3. 初始化随机数种子
  4. 初始化数据库
  5. 声明启动程序模式
  6. 配置启动参数并启动服务
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")   // 设置配置文件名为“config”
	viper.SetConfigType("ini")      // 设置配置文件类型为“ini”
	viper.AddConfigPath(configPath) // 设置在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("初始化数据失败", 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 包

通常被用于数据存储层的实现,可将底层数据库访问操作封装隐藏细节以简化数据库操作

mysql.go 文件

使用 gorm 初始化 MySQL 数据库连接

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("连接数据库失败", err.Error())
	}
	// 测试数据库连接
	err = Db.Exec("SELECT 1").Error
	if err != nil {
		log.Panic("数据库连接失败", err.Error())
	}
	return
}

routers 包

通常用于路由器配置,这个包中包含的代码需要读取 HTTP 请求并将该请求发送到相应后端的处理程序,然后从处理程序获取响应

routers.go 文件

  1. 创建日志记录器
  2. 初始化 gin 引擎
  3. 配置 cors 跨域请求
  4. 设置一个默认路由,及无请求到路由时返回的数据
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 {
	// 创建一个生产级别的日志记录器
	logger, err := zap.NewProduction()
	if err != nil {
		panic(err)
	}
	// 在函数结束后刷新缓冲区
	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)

	// 下面有两个配置
	// 如果将前端服务与后端服务同时启动可以设置第一种,将前端打包的文件放到 public 文件夹内
	// 我这里设置的使用 vite 打包,所以就下面这种设置,可以自行更改
	// 当直接访问的时候,就相当于请求"/"路由,就会访问 index.html 页面
	// 设置静态文件服务目录
	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")
	})

	// 如果前后端分离模式,可以设置为请求到没有的路由就返回 Not Found
	r.NoRoute(func(c *gin.Context) {
		c.JSON(http.StatusNotFound, gin.H{
			"msg": "Not Found",
		})
	})

	return r
}

controller 包

负责维护业务逻辑的实现,同时调用 Dao 对象实现数据存储、检索等功能,通常与用户交互并处理相关活动

controller.go 文件

  1. 创建初始默认路由函数,使用 info 级别的日志记录并返回数据
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 文件

外部配置文件

[service]
host=127.0.0.1
port=8000
[database]
user=root
pwd=123456
host=127.0.0.1
port=3306
name=databasename

build.bat 文件

打包脚本,不用每次修改环境变量,不用手动输入打包命令
脚本内容:修改环境变量为 arm64 架构 Linux 系统,打包,还原为 amd64 架构 Windows 系统,我这里使用 Windows 做开发,需要部署到 arm64 架构的 Linux 服务器上,所以这样写,根据需要自行更改文章来源地址https://www.toymoban.com/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

到了这里,关于初始化一个Gin框架的Go-Web项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Go学习之 go mod】gomod小白入门,在github上发布自己的项目(项目初始化、项目发布、项目版本升级等)

    Go语言基础之包 | 李文周的博客 Go mod的使用、发布、升级 | wei Go Module如何发布v2及以上版本 1.2.7. go mod命令 — 新溪-gordon V1.7.9 文档 golang go 包管理工具 go mod的详细介绍-腾讯云开发者社区-腾讯云 Go Mod 常见错误的原因 | walker的博客 oceanweave/testgomod 用于发布 go 包,v1 v2 版本等

    2024年02月03日
    浏览(64)
  • Vue项目中app.js过大,导致web初始化加载过慢问题

    1、删除多余不需要的库: npm uninstall xxx 如例如moment库文件是很大的可以直接放到index.html文件直接CDN引入 2、修改/config/index.js配置文件:将productionGzip设置为false ​ 3、设置vue-router懒加载 懒加载配置: ​ 非懒加载配置: ​ 4、在webpack.prod.conf.js文件中修改配置: ​ 5、在in

    2024年02月11日
    浏览(42)
  • 用React给XXL-JOB开发一个新皮肤(一):环境搭建和项目初始化

    一. 简述 二. Fork 项目 三. 搭建开发环境 四. 初始化皮肤项目 五. 添加相关依赖 六. 预览 大名鼎鼎的 xxl-job 任务调度中心我们应该都使用过,项目地址:xxl-job。它是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 该项目中的页面是使用

    2024年02月01日
    浏览(34)
  • 如何优雅地在Spring Boot项目启动时初始化数据,让你的Web应用快人一步

    🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 大多数Java Web应用程序中,项目在启动时都需要加载一些初始化数据,例如配置文件、数据库连接信息等。在Spring Boot中,我们可以通过将数据缓存到内存中来提高Web应用程序的性能。本篇博客旨在通过一个实例来介绍如

    2024年02月02日
    浏览(57)
  • go语言数据初始化

    数据的声明: 初始化数组的初始化有多种形式。 [5] int {1,2,3,4,5} 长度为5的数组,其元素值依次为:1,2,3,4,5。 [5] int {1,2} 长度为 5 的数组,其元素值依次为:1,2,0,0,0 。 在初始化时没有指定初值的元素将会赋值为其元素类型 int 的默认值0,string 的默认值是 “”。

    2024年02月03日
    浏览(50)
  • go语言包、变量、init初始化顺序

    一个完整的 go 语言可运行程序,通常会包含引用的包、变量、init 函数以及 main 函数几个部分。 包、变量、常量、init 函数以及 main 函数初始化顺序如下图所示: 在一个 go 语言程序中,初始化顺序规则如下: 引入的包 当前包中的变量、常量 当前包的 init 函数 main 函数 初始

    2023年04月14日
    浏览(51)
  • 基于go语言gin框架的web项目骨架

    节省时间与精力,更高效地打造稳定可靠的Web项目:基于Go语言和Gin框架的完善Web项目骨架。无需从零开始,直接利用这个骨架,快速搭建一个功能齐全、性能优异的Web应用。充分发挥Go语言和Gin框架的优势,轻松处理高并发、大流量的请求。构建可扩展性强、易于维护的代码

    2024年02月08日
    浏览(46)
  • 【随机种子初始化】一个神经网络模型初始化的大坑

    半年前写了一个模型,取得了不错的效果(简称项目文件1),于是整理了一番代码,保存为了一个新的项目(简称项目文件2)。半年后的今天,我重新训练这个整理过的模型,即项目文件2,没有修改任何的超参数,并且保持完全一致的随机种子,但是始终无法完全复现出半

    2024年02月09日
    浏览(69)
  • 【Golang入门教程】Go语言变量的初始化

    强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站: 人工智能 推荐一个个人工作,日常中比较常用的人工智能工具,无需魔法,忍不住分享一下给大家。点击跳转到网站: 人工智能工具 引言 在Go语言中,变量

    2024年04月17日
    浏览(78)
  • 【Go 基础篇】Go语言 init函数详解:包的初始化与应用

    在Go语言中, init() 函数是一种特殊的函数,用于在包被导入时执行一次性的初始化操作。 init() 函数不需要手动调用,而是在包被导入时自动执行。这使得我们可以在包导入时完成一些必要的初始化工作,确保包的使用具有正确的环境和状态。 本篇博客将深入探讨 init() 函数

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包