国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

初始化一個Gin框架的Go-Web項目

這篇具有很好參考價值的文章主要介紹了初始化一個Gin框架的Go-Web項目。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

使用到的第三方庫

  • gin Gin 框架
  • viper 配置文件管理
  • cors 跨域資源請求配置
  • gorm ORM 庫
  • zap 日志記錄

main 包

Go 語言程序的入口點

main.go 文件

  1. 使用 flag 讀取配置文件路徑參數(shù),默認當(dāng)前目錄下
  2. 使用 viper 讀取 config.ini 配置文件初始化初始數(shù)據(jù)
  3. 初始化隨機數(shù)種子
  4. 初始化數(shù)據(jù)庫
  5. 聲明啟動程序模式
  6. 配置啟動參數(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 文件

  1. 創(chuàng)建日志記錄器
  2. 初始化 gin 引擎
  3. 配置 cors 跨域請求
  4. 設(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 文件

  1. 創(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 文件

外部配置文件

[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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Go學(xué)習(xí)之 go mod】gomod小白入門,在github上發(fā)布自己的項目(項目初始化、項目發(fā)布、項目版本升級等)

    【Go學(xué)習(xí)之 go mod】gomod小白入門,在github上發(fā)布自己的項目(項目初始化、項目發(fā)布、項目版本升級等)

    Go語言基礎(chǔ)之包 | 李文周的博客 Go mod的使用、發(fā)布、升級 | wei Go Module如何發(fā)布v2及以上版本 1.2.7. go mod命令 — 新溪-gordon V1.7.9 文檔 golang go 包管理工具 go mod的詳細介紹-騰訊云開發(fā)者社區(qū)-騰訊云 Go Mod 常見錯誤的原因 | walker的博客 oceanweave/testgomod 用于發(fā)布 go 包,v1 v2 版本等

    2024年02月03日
    瀏覽(45)
  • Vue項目中app.js過大,導(dǎo)致web初始化加載過慢問題

    Vue項目中app.js過大,導(dǎo)致web初始化加載過慢問題

    1、刪除多余不需要的庫: npm uninstall xxx 如例如moment庫文件是很大的可以直接放到index.html文件直接CDN引入 2、修改/config/index.js配置文件:將productionGzip設(shè)置為false ? 3、設(shè)置vue-router懶加載 懶加載配置: ? 非懶加載配置: ? 4、在webpack.prod.conf.js文件中修改配置: ? 5、在in

    2024年02月11日
    瀏覽(24)
  • 用React給XXL-JOB開發(fā)一個新皮膚(一):環(huán)境搭建和項目初始化

    用React給XXL-JOB開發(fā)一個新皮膚(一):環(huán)境搭建和項目初始化

    一. 簡述 二. Fork 項目 三. 搭建開發(fā)環(huán)境 四. 初始化皮膚項目 五. 添加相關(guān)依賴 六. 預(yù)覽 大名鼎鼎的 xxl-job 任務(wù)調(diào)度中心我們應(yīng)該都使用過,項目地址:xxl-job。它是一個分布式任務(wù)調(diào)度平臺,其核心設(shè)計目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴展。 該項目中的頁面是使用

    2024年02月01日
    瀏覽(21)
  • 如何優(yōu)雅地在Spring Boot項目啟動時初始化數(shù)據(jù),讓你的Web應(yīng)用快人一步

    如何優(yōu)雅地在Spring Boot項目啟動時初始化數(shù)據(jù),讓你的Web應(yīng)用快人一步

    ?? 歡迎點贊 ?? 收藏 ?留言 ?? 如有錯誤敬請指正! 大多數(shù)Java Web應(yīng)用程序中,項目在啟動時都需要加載一些初始化數(shù)據(jù),例如配置文件、數(shù)據(jù)庫連接信息等。在Spring Boot中,我們可以通過將數(shù)據(jù)緩存到內(nèi)存中來提高Web應(yīng)用程序的性能。本篇博客旨在通過一個實例來介紹如

    2024年02月02日
    瀏覽(30)
  • go語言數(shù)據(jù)初始化

    數(shù)據(jù)的聲明: 初始化數(shù)組的初始化有多種形式。 [5] int {1,2,3,4,5} 長度為5的數(shù)組,其元素值依次為:1,2,3,4,5。 [5] int {1,2} 長度為 5 的數(shù)組,其元素值依次為:1,2,0,0,0 。 在初始化時沒有指定初值的元素將會賦值為其元素類型 int 的默認值0,string 的默認值是 “”。

    2024年02月03日
    瀏覽(27)
  • go語言包、變量、init初始化順序

    go語言包、變量、init初始化順序

    一個完整的 go 語言可運行程序,通常會包含引用的包、變量、init 函數(shù)以及 main 函數(shù)幾個部分。 包、變量、常量、init 函數(shù)以及 main 函數(shù)初始化順序如下圖所示: 在一個 go 語言程序中,初始化順序規(guī)則如下: 引入的包 當(dāng)前包中的變量、常量 當(dāng)前包的 init 函數(shù) main 函數(shù) 初始

    2023年04月14日
    瀏覽(27)
  • 基于go語言gin框架的web項目骨架

    節(jié)省時間與精力,更高效地打造穩(wěn)定可靠的Web項目:基于Go語言和Gin框架的完善Web項目骨架。無需從零開始,直接利用這個骨架,快速搭建一個功能齊全、性能優(yōu)異的Web應(yīng)用。充分發(fā)揮Go語言和Gin框架的優(yōu)勢,輕松處理高并發(fā)、大流量的請求。構(gòu)建可擴展性強、易于維護的代碼

    2024年02月08日
    瀏覽(26)
  • 【隨機種子初始化】一個神經(jīng)網(wǎng)絡(luò)模型初始化的大坑

    【隨機種子初始化】一個神經(jīng)網(wǎng)絡(luò)模型初始化的大坑

    半年前寫了一個模型,取得了不錯的效果(簡稱項目文件1),于是整理了一番代碼,保存為了一個新的項目(簡稱項目文件2)。半年后的今天,我重新訓(xùn)練這個整理過的模型,即項目文件2,沒有修改任何的超參數(shù),并且保持完全一致的隨機種子,但是始終無法完全復(fù)現(xiàn)出半

    2024年02月09日
    瀏覽(29)
  • 【Golang入門教程】Go語言變量的初始化

    【Golang入門教程】Go語言變量的初始化

    強烈推薦 前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點擊跳轉(zhuǎn)到網(wǎng)站: 人工智能 推薦一個個人工作,日常中比較常用的人工智能工具,無需魔法,忍不住分享一下給大家。點擊跳轉(zhuǎn)到網(wǎng)站: 人工智能工具 引言 在Go語言中,變量

    2024年04月17日
    瀏覽(106)
  • 【Go 基礎(chǔ)篇】Go語言 init函數(shù)詳解:包的初始化與應(yīng)用

    在Go語言中, init() 函數(shù)是一種特殊的函數(shù),用于在包被導(dǎo)入時執(zhí)行一次性的初始化操作。 init() 函數(shù)不需要手動調(diào)用,而是在包被導(dǎo)入時自動執(zhí)行。這使得我們可以在包導(dǎo)入時完成一些必要的初始化工作,確保包的使用具有正確的環(huán)境和狀態(tài)。 本篇博客將深入探討 init() 函數(shù)

    2024年02月11日
    瀏覽(37)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包