最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go搭建高效的Gin Web目錄結(jié)構(gòu)

 更新時間:2025年08月08日 09:49:28   作者:Vespeng  
本文主要介紹了Go搭建高效的Gin Web目錄結(jié)構(gòu),構(gòu)建一個既高效又便于管理的項目架構(gòu),助力開發(fā)者打造既快速響應又易于維護的Web應用程序,感興趣的可以了解一下

引言

在當今迅速迭代的軟件開發(fā)領域,挑選合適的工具與框架對于項目能否順利推進至關重要。Gin 框架,作為 Go 語言生態(tài)中備受青睞的 Web 開發(fā)框架,憑借其卓越的性能、簡潔的設計以及豐富的功能特性,在眾多選項中脫穎而出。本文旨在深入剖析如何在使用 Gin 框架的過程中,構(gòu)建一個既高效又便于管理的項目架構(gòu),助力開發(fā)者打造既快速響應又易于維護的 Web 應用程序。

一、Gin 概述

引入官網(wǎng)的描述:Gin 是一個使用 Go 語言開發(fā)的 Web 框架。 它提供類似 Martini 的 API,但性能更佳,速度提升高達40倍。 如果你是性能和高效的追求者, 你會愛上 Gin。

對比 Beego 框架,Gin 框架采用了極簡主義的方法,為追求簡單和高性能,沒有多余文件或目錄,他甚至什么也沒有,沒有集成任何中間件,一個 main 文件即可啟動一個 web 服務。

正因為如上所述,過分精簡對于開發(fā)一個項目來說,前期的項目搭建工作就顯得尤為重要。

二、項目結(jié)構(gòu)設計

有過 Java 開發(fā)經(jīng)驗的伙伴應該了解,SpringBoot 遵循著 MVC 的設計理念,這一套設計理念一直沿用至今,他的優(yōu)秀難以言喻,Gin 框架完全可以參照這個模式來做,如下是我個人設計的一套架構(gòu):

├── /cmd  
│   └── main.go  
├── /configs
│   └── config.yaml
├── /docs
├── /internal
│   ├── /api
│   │   ├── v1
│   │   │   ├── /routes.go
│   ├── /app
│   │   ├── bootstrap.go
│   │   ├── config.go
│   │   ├── db.go
│   │   └── ...
│   ├── /controller
│   │   ├── user_controller.go
│   │   └── ...
│   ├── /middleware
│   │   ├── error.go
│   │   └── ...
│   ├── /model
│   │   ├── user_entity.go
│   │   └── ...  
│   ├── /repository
│   │   ├── user_repository.go
│   │   └── ...  
│   ├── /service
│   │   ├── user_service.go
│   │   └── ...
│   └── /utils
├── /pkg
├── /scripts
├── /tests
├── .env
├── go.mod
├── go.sum

三、目錄職責

  • /cmd
    • 存放應用的入口文件。
    • main.go:是整個應用的入口,在這里啟動應用。
  • /configs
    • 存放應用的配置文件和配置加載邏輯。
    • config.yaml:應用的配置文件,通常包含數(shù)據(jù)庫連接信息、服務器設置等。
  • /docs
    • 存放應用的文檔,如API文檔、用戶手冊等。
  • /internal
    • 存放應用的內(nèi)部邏輯,這些代碼不能被外部包所引入,可根據(jù)實際需求進而拆分目錄。
    • api:包含應用中核心的業(yè)務路由等,即URL路徑與控制器方法的映射。
    • app:包含應用的核心邏輯,如初始化、啟動等。
    • controller:包含控制器邏輯,處理請求并返回響應。
    • middleware:存放中間件代碼,用于在請求處理流程中的特定階段執(zhí)行代碼。
    • model:定義應用的數(shù)據(jù)模型,通常與數(shù)據(jù)庫表結(jié)構(gòu)對應。
    • repository:實現(xiàn)數(shù)據(jù)訪問邏輯,與數(shù)據(jù)庫進行交互。
    • service:實現(xiàn)業(yè)務邏輯,調(diào)用repository中的方法來處理業(yè)務需求。
    • utils:包含通用的工具函數(shù),這些函數(shù)可以被多個包所共享。
  • /pkg
    • 存放第三方庫,如第三方中間件、工具庫等。
  • /scripts
    • 存放各種腳本,如項目部署腳本、測試腳本等。
  • /tests
    • 存放測試代碼,包括單元測試、集成測試等。
    • 這里的目錄結(jié)構(gòu)可以根據(jù)需要自行組織,以支持不同類型的測試。

以上目錄結(jié)構(gòu)有助于清晰地分離應用的不同部分,使得代碼更加模塊化、易于理解和維護。同時,我也參照眾多優(yōu)秀開源項目的目錄搭建思想,使其完美遵循了Go語言的最佳實踐。

四、實戰(zhàn)

目錄搭建好后,開始填充代碼

下邊簡單實現(xiàn)集成數(shù)據(jù)庫,配置路由,啟動服務

1. 配置config

在 config.yaml 文件下配置端口和數(shù)據(jù)庫連接,這里選擇 xorm:

# 基礎配置
app:
  port: 8080
database:
  driver: mysql
  source: root:123456@tcp(127.0.0.1:3306)/xxx_table?charset=utf8mb4&parseTime=True&loc=Local

在 config.go 下解析配置

package config

import (
    "fmt"
    "github.com/spf13/viper"
)

type Config struct {
    App      AppConfig      `yaml:"app" mapstructure:"app"`
    Database DatabaseConfig `yaml:"database" mapstructure:"database"`
}

type AppConfig struct {
    Port int `mapstructure:"port"`
}

type DatabaseConfig struct {
    Driver string `yaml:"driver" mapstructure:"driver"`
    Source string `yaml:"source" mapstructure:"source"`
}

var Conf *Config

// LoadConfig 加載配置文件
func LoadConfig() error {

    // 設置配置文件路徑和名稱
    viper.AddConfigPath("./configs")
    viper.SetConfigName("config")
    viper.SetConfigType("yaml")

    // 讀取配置文件
    err = viper.ReadInConfig()
    if err != nil {
        return fmt.Errorf("讀取配置文件失敗: %v", err)
    }

    // 將配置文件內(nèi)容解析到 Conf 變量中
    Conf = &Config{}
    err = viper.Unmarshal(Conf)
    if err != nil {
        return fmt.Errorf("解析配置文件失敗: %v", err)
    }

    return nil
}

2. 配置init

數(shù)據(jù)庫及其他的初始化統(tǒng)一放置到 app 目錄下,在這里新建 loader.go 來初始化 mysql,但是為了之后方便管理,我們另單獨創(chuàng)建 db.go 文件:

如需要加載其他如 redis,那就新建 redis.go 文件

package app

import (
    _ "github.com/go-sql-driver/mysql"
    "github.com/go-xorm/xorm"
    log "github.com/sirupsen/logrus"
    "yourProject/config"
)

var Engine *xorm.Engine

// InitializeMySQL 數(shù)據(jù)庫初始化
func InitializeMySQL() error {
    var err error
    // 創(chuàng)建數(shù)據(jù)庫引擎
    Engine, err = xorm.NewEngine(config.Conf.Database.Driver, config.Conf.Database.Source)
    if err != nil {
        log.Error("數(shù)據(jù)庫初始化失敗: %v", err)
        return err
    }

    // 測試數(shù)據(jù)庫連接
    if err = Engine.Ping(); err != nil {
        log.Error("數(shù)據(jù)庫連接失敗: %v", err)
        return err
    }

    return nil
}

app.go 中調(diào)用 InitializeMySQL()

package app

import (
    "fmt"
)

// InitializeAll 初始化所有模塊
func InitializeAll() error {
    err := InitializeMySQL()
    if err != nil {
        return fmt.Errorf("MySQL初始化錯誤: %v", err)
    }

    return nil
}

3. 配置model

在 model 下新建 user_entity.go,注意:這個需要和數(shù)據(jù)庫對應

package model

type User struct {
    Id          int64  `xorm:"pk autoincr 'id'"`
    UserID      int64  `xorm:"not null 'user_id'"`
    Password    string `xorm:"varchar(50) not null 'password'"`
    UserName    string `xorm:"varchar(30) 'user_name'"`
    Email       string `xorm:"varchar(50) 'email'"`
    PhoneNumber int64  `xorm:"'phone_number'"`
    Sex         string `xorm:"char(1) 'sex'"`
    Remark      string `xorm:"varchar(500) 'remark'"`
}

// TableName 方法用于返回表名
func (u User) TableName() string {
    return "user"
}

4. 配置controller

在 controller 下新建 user_controller.go

package controller

import (
    "your_project/internal/service"
    "github.com/gin-gonic/gin"
    "net/http"
)

type UserController struct {
    UserService *service.UserService
}

func NewUserController(UserService *service.UserService) *UserController {
    return &UserController{UserService: UserService}
}

func (uc *UserController) GetUsers(c *gin.Context) {
    users, err := uc.UserService.GetUsers()
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch users"})
            return
        }
    c.JSON(http.StatusOK, gin.H{"users": users})
}

5. 配置service

在 service 下新建 user_service.go

package service

import (
    "your_project/internal/model"
    "your_project/internal/repository"
    "github.com/go-xorm/xorm"
)

type UserService struct {
    userRepo *repository.UserRepository
}

func NewUserService(engine *xorm.Engine) *UserService {
    return &UserService{userRepo: repository.NewUserRepository(engine)}
}

func (us *UserService) GetUsers() ([]*models.User, error) {
    return us.userRepo.GetUsers()
}

6. 配置repository

在 repository 下新建 user_repo.go

package repository

import (
    "your_project/internal/model"
    "github.com/go-xorm/xorm"
)

type UserRepository struct {
    engine *xorm.Engine
}

func NewUserRepository(engine *xorm.Engine) *UserRepository {
    return &UserRepository{engine: engine}
}

// GetUsers 獲取所有用戶
func (r *UserRepository) GetUsers() ([]*model.User, error) {
    var users []*model.User
    err := r.engine.Table(model.User{}.TableName()).Find(&users)
    return users, err
}

7. 配置api

routes.go 中設置路由,這里設置路由組,為方便日后迭代

package v1

import (
    "github.com/gin-gonic/gin"
    "github.com/go-xorm/xorm"
    "your_project/internal/controller"
    "your_project/internal/service"
)

func SetupRoutes(r *gin.Engine, engine *xorm.Engine) {
    // 定義用戶路由組
    user := r.Group("/user")
    {
        // 創(chuàng)建 UserService 實例
        UserService := service.NewUserService(engine)
        // 創(chuàng)建 UserController 實例
        UserController := controller.NewUserController(UserService)

        user.GET("/", UserController.GetUsers)
    }
}

8. 配置bootstrap

package app

import (
    "fmt"
    "github.com/gin-gonic/gin"
    log "github.com/sirupsen/logrus"
    "your_project/config"
    "your_project/internal/api/v1"
    "your_project/internal/app"
)

func Start() {
    // 加載配置文件
    err := config.LoadConfig()
    if err != nil {
        log.Error("配置文件加載錯誤: %v", err)
        return
    }

    // 初始化所有模塊
    err = InitializeAll()
    if err != nil {
        log.Error("模塊初始化錯誤: %v", err)
        return
    }

    r := gin.Default()
    v1.SetupRoutes(r, Engine)

    err = r.Run(fmt.Sprintf(":%d", config.Conf.App.Port))
    if err != nil {
        log.Error("服務啟動錯誤: %v", err)
        return
    }
}

9. 配置main

package app

import "your_project/internal/app"

func main() {
    app.Start()
}

截至這里,一個基本的查詢請求就已構(gòu)建完成

10. 啟動項目

cmd 目錄下直接運行 main 函數(shù),正常會輸出如下信息:

Listening and serving HTTP on :8080

接著訪問 http://localhost:8080/user 正常查詢結(jié)果回顯 json 如下:

{
    "users": [
        {
            "Id": 1,
            "UserID": "000001",
            "Password": "123456",
            ...
        }
    ]
}

到此這篇關于Go搭建高效的Gin Web目錄結(jié)構(gòu)的文章就介紹到這了,更多相關Gin Web目錄結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go搭建高效的Gin Web目錄結(jié)構(gòu)

    Go搭建高效的Gin Web目錄結(jié)構(gòu)

    本文主要介紹了Go搭建高效的Gin Web目錄結(jié)構(gòu),構(gòu)建一個既高效又便于管理的項目架構(gòu),助力開發(fā)者打造既快速響應又易于維護的Web應用程序,感興趣的可以了解一下
    2025-08-08
  • Go語言實現(xiàn)可選參數(shù)的方法小結(jié)

    Go語言實現(xiàn)可選參數(shù)的方法小結(jié)

    這篇文章主要為大家詳細介紹了Go語言實現(xiàn)可選參數(shù)的一些常見方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-02-02
  • Go構(gòu)建WiFi局域網(wǎng)聊天室示例詳解

    Go構(gòu)建WiFi局域網(wǎng)聊天室示例詳解

    這篇文章主要為大家介紹了Go構(gòu)建WiFi局域網(wǎng)聊天室示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Golang匯編之控制流深入分析講解

    Golang匯編之控制流深入分析講解

    這篇文章主要介紹了Golang匯編之控制流,程序執(zhí)行的流程主要有順序、分支和循環(huán)幾種執(zhí)行流程,本節(jié)主要討論如何將Go語言的控制流比較直觀地轉(zhuǎn)譯為匯編程序,或者說如何以匯編思維來編寫Go語言代碼,感興趣的同學可以參考下文
    2023-05-05
  • Go 實現(xiàn)英尺和米的簡單單位換算方式

    Go 實現(xiàn)英尺和米的簡單單位換算方式

    這篇文章主要介紹了Go 實現(xiàn)英尺和米的簡單單位換算方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Golang變量直接初始化的方法詳解

    Golang變量直接初始化的方法詳解

    在 Go 語言中,我們常用的數(shù)據(jù)結(jié)構(gòu)有在Go語言中,你可以初始化不同的數(shù)據(jù)結(jié)構(gòu),例如數(shù)組、切片、結(jié)構(gòu)體、指針、map等,本文將給大家介紹一下Golang變量直接初始化的方法,需要的朋友可以參考下
    2023-08-08
  • golang atomic原子操作示例詳解

    golang atomic原子操作示例詳解

    這篇文章主要為大家介紹了golang atomic原子操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Go1.18新特性工作區(qū)模糊測試及泛型的使用詳解

    Go1.18新特性工作區(qū)模糊測試及泛型的使用詳解

    這篇文章主要為大家介紹了Go?1.18新特性中的工作區(qū)?模糊測試?泛型使用進行詳細講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Go字符串操作深入解析

    Go字符串操作深入解析

    這篇文章主要為大家介紹了Go字符串操作深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Go語言生產(chǎn)環(huán)境最常用、最可靠的包清單

    Go語言生產(chǎn)環(huán)境最常用、最可靠的包清單

    在開發(fā)Go語言項目時,包管理是一個非常重要的環(huán)節(jié),這篇文章主要介紹了Go語言生產(chǎn)環(huán)境最常用、最可靠包的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-03-03

最新評論

余姚市| 凤山县| 屏边| 宁强县| 洛扎县| 凤城市| 凤凰县| 通化县| 新干县| 安阳县| 大冶市| 仙桃市| 武义县| 兴山县| 洞头县| 沈阳市| 皋兰县| 莫力| 天柱县| 内江市| 信丰县| 本溪市| 肥乡县| 错那县| 江陵县| 乌什县| 漯河市| 奇台县| 云和县| 泾川县| 西乡县| 松原市| 乐昌市| 万安县| 望谟县| 通州区| 峨眉山市| 余干县| 绥芬河市| 中卫市| 平潭县|