亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

gin+gorm實現(xiàn)goweb項目的示例代碼

 更新時間:2025年03月31日 10:05:08   作者:JawCat  
Gorm是Go語言的ORM框架,提供一套對數(shù)據(jù)庫進行增刪改查的接口,本文主要介紹了gin+gorm實現(xiàn)goweb項目的示例代碼,具有一定的參考價值,感興趣的可以了解一下

Gin

  • Gin 是一個用 Go 編寫的輕量級、高性能的 Web 框架。它的主要功能是處理 HTTP 請求和響應,幫助開發(fā)者快速構建 Web 應用程序和 API 服務。

  • 通俗解釋
    Gin 框架就像一個服務員,負責接收客戶的訂單(HTTP 請求),根據(jù)菜單(路由規(guī)則)將訂單轉交給合適的廚師(處理函數(shù)),廚師準備好食物(生成響應數(shù)據(jù))后,服務員再將食物遞給客戶(返回 HTTP 響應)。

1. 主要功能

  • 路由:Gin 允許你定義不同的 URL 路徑和 HTTP 方法(如 GET、POST),并將它們映射到相應的處理函數(shù)。
  • 中間件:可以在請求處理過程中插入多個中間件函數(shù),用于認證、日志記錄等操作。
  • 參數(shù)綁定:支持從 URL、表單、JSON 等位置獲取參數(shù)并綁定到結構體中。
  • 錯誤處理:提供方便的錯誤處理機制,統(tǒng)一管理錯誤響應。

2. 工作流程

  • 定義路由:開發(fā)者定義各種路由和它們對應的處理函數(shù)。
  • 啟動服務器:Gin 框架啟動一個 HTTP 服務器,監(jiān)聽特定端口。
  • 接收請求:當有 HTTP 請求到達時,Gin 根據(jù)請求的路徑和方法查找對應的處理函數(shù)。
  • 執(zhí)行中間件:在處理函數(shù)執(zhí)行之前,依次執(zhí)行注冊的中間件。
  • 處理請求:調用對應的處理函數(shù),生成響應數(shù)據(jù)。
  • 返回響應:將響應數(shù)據(jù)返回給客戶端。

3. 示例

package main

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

func main() {
    r := gin.Default()

    r.GET("/ping", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{
            "message": "pong",
        })
    })

    r.Run(":8080")
}


Gorm

  • Gorm 是一個用 Go 編寫的 ORM(對象關系映射)庫,它的主要功能是簡化數(shù)據(jù)庫操作。Gorm 通過將數(shù)據(jù)庫表映射為 Go 結構體,使得開發(fā)者可以使用 Go 代碼來執(zhí)行數(shù)據(jù)庫的增刪改查等操作,而不需要直接編寫 SQL 語句。

  • 通俗解釋:Gorm 就像一個翻譯器,它把開發(fā)者寫的 Go 代碼翻譯成數(shù)據(jù)庫能夠理解的 SQL 語句,并且負責執(zhí)行這些 SQL 語句,將結果再翻譯回 Go 語言的數(shù)據(jù)結構。

1. 主要功能

  • 模型定義:將數(shù)據(jù)庫表映射為 Go 結構體,定義字段及其屬性。
  • 查詢:提供簡潔的查詢方法,如創(chuàng)建記錄、讀取記錄、更新記錄、刪除記錄等。
  • 關系:支持數(shù)據(jù)庫表之間的關系,如一對一、一對多、多對多關系。
  • 遷移:自動遷移數(shù)據(jù)庫表結構,使其與 Go 結構體保持同步。

2. 工作流程

  • 定義模型:開發(fā)者定義與數(shù)據(jù)庫表對應的 Go 結構體。
  • 初始化數(shù)據(jù)庫連接:配置數(shù)據(jù)庫連接信息,并建立連接。
  • 執(zhí)行操作:使用 Gorm 提供的方法來進行數(shù)據(jù)庫操作,如創(chuàng)建、查詢、更新、刪除等。
  • 處理結果:將數(shù)據(jù)庫操作的結果映射回 Go 結構體中,供業(yè)務邏輯使用。

3. 示例

package main

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "log"
)

type User struct {
    ID    uint   `gorm:"primaryKey"`
    Name  string `gorm:"size:255"`
    Email string `gorm:"uniqueIndex"`
    Age   int
}

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal(err)
    }

    // 自動遷移
    db.AutoMigrate(&User{})

    // 創(chuàng)建記錄
    db.Create(&User{Name: "John", Email: "john@example.com", Age: 25})

    // 讀取記錄
    var user User
    db.First(&user, 1) // 查詢主鍵為1的用戶
    log.Println(user)

    // 更新記錄
    db.Model(&user).Update("Age", 26)

    // 刪除記錄
    db.Delete(&user)
}

Gin+Gorm項目實操

1. 項目目錄結構

my-gin-gorm-project/
│
├── cmd/
│   └── main.go        // 主程序入口
│
├── config/
│   └── config.go      // 配置文件解析
│
├── controllers/
│   └── user.go        // 用戶相關的控制器
│
├── models/
│   └── user.go        // 用戶模型定義
│
├── routes/
│   └── routes.go      // 路由定義
│
├── middlewares/
│   └── auth.go        // 認證中間件
│
├── services/
│   └── user.go        // 用戶相關的業(yè)務邏輯
│
├── repositories/
│   └── user.go        // 用戶數(shù)據(jù)訪問層
│
├── utils/
│   └── utils.go       // 工具函數(shù)
│
├── .env               // 環(huán)境變量文件
├── go.mod             // Go模塊文件
└── go.sum             // 依賴文件

2. 主程序入口(cmd/main.go)

package main

import (
    "my-gin-gorm-project/config"
    "my-gin-gorm-project/routes"
    "github.com/gin-gonic/gin"
    "gorm.io/gorm"
)

var db *gorm.DB

func main() {
    // 解析配置文件
    config.LoadConfig()

    // 初始化數(shù)據(jù)庫連接
    db = config.InitDB()

    // 設置Gin引擎
    r := gin.Default()

    // 注冊路由
    routes.RegisterRoutes(r)

    // 啟動服務器
    r.Run(config.Config.ServerPort)
}

3. 配置文件解析(config/config.go)

package config

import (
    "log"
    "os"
    "github.com/joho/godotenv"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

var Config struct {
    ServerPort string
    DBUser     string
    DBPassword string
    DBName     string
    DBHost     string
    DBPort     string
}

// LoadConfig 解析配置文件
func LoadConfig() {
    if err := godotenv.Load(); err != nil {
        log.Fatal("Error loading .env file")
    }

    Config.ServerPort = os.Getenv("SERVER_PORT")
    Config.DBUser = os.Getenv("DB_USER")
    Config.DBPassword = os.Getenv("DB_PASSWORD")
    Config.DBName = os.Getenv("DB_NAME")
    Config.DBHost = os.Getenv("DB_HOST")
    Config.DBPort = os.Getenv("DB_PORT")
}

// InitDB 初始化數(shù)據(jù)庫連接
func InitDB() *gorm.DB {
    dsn := Config.DBUser + ":" + Config.DBPassword + "@tcp(" + Config.DBHost + ":" + Config.DBPort + ")/" + Config.DBName + "?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("Failed to connect to database:", err)
    }
    return db
}

4. 用戶模型定義(models/user.go)

package models

import "gorm.io/gorm"

// User 用戶模型定義
type User struct {
    gorm.Model
    Name  string `gorm:"size:255"`
    Email string `gorm:"uniqueIndex"`
    Age   int
}

5. 用戶相關的控制器(controllers/user.go)

package controllers

import (
    "my-gin-gorm-project/models"
    "my-gin-gorm-project/services"
    "net/http"
    "github.com/gin-gonic/gin"
)

// GetUsers 獲取所有用戶
func GetUsers(c *gin.Context) {
    users := services.GetAllUsers()
    c.JSON(http.StatusOK, users)
}

// CreateUser 創(chuàng)建新用戶
func CreateUser(c *gin.Context) {
    var user models.User
    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    if err := services.CreateUser(&user); err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }
    c.JSON(http.StatusOK, user)
}

6. 用戶數(shù)據(jù)訪問層(repositories/user.go)

package repositories

import (
    "my-gin-gorm-project/models"
    "gorm.io/gorm"
)

var DB *gorm.DB

// SetDB 設置數(shù)據(jù)庫實例
func SetDB(db *gorm.DB) {
    DB = db
}

// GetAllUsers 獲取所有用戶
func GetAllUsers() ([]models.User, error) {
    var users []models.User
    if err := DB.Find(&users).Error; err != nil {
        return nil, err
    }
    return users, nil
}

// CreateUser 創(chuàng)建新用戶
func CreateUser(user *models.User) error {
    if err := DB.Create(user).Error; err != nil {
        return err
    }
    return nil
}

7. 用戶相關的業(yè)務邏輯(services/user.go)

package services

import (
    "my-gin-gorm-project/models"
    "my-gin-gorm-project/repositories"
)

// GetAllUsers 獲取所有用戶
func GetAllUsers() []models.User {
    users, _ := repositories.GetAllUsers()
    return users
}

// CreateUser 創(chuàng)建新用戶
func CreateUser(user *models.User) error {
    return repositories.CreateUser(user)
}

8. 路由定義(routes/routes.go)

package routes

import (
    "my-gin-gorm-project/controllers"
    "github.com/gin-gonic/gin"
)

// RegisterRoutes 注冊所有路由
func RegisterRoutes(r *gin.Engine) {
    // 用戶相關路由
    userRoutes := r.Group("/users")
    {
        userRoutes.GET("/", controllers.GetUsers)
        userRoutes.POST("/", controllers.CreateUser)
    }
}

9. 環(huán)境變量文件(.env)

SERVER_PORT=:8080
DB_USER=root
DB_PASSWORD=password
DB_NAME=mydb
DB_HOST=localhost
DB_PORT=3306

10. 補充:關于utils和Middlewares的區(qū)別以及使用

Utils(工具類)

  • 功能:工具類目錄用于存放項目中常用的工具函數(shù)和通用模塊。這些函數(shù)和模塊通常獨立于業(yè)務邏輯,可以在項目的各個部分復用。

  • 存放內(nèi)容:

    通用工具函數(shù):例如字符串處理函數(shù)、日期時間處理函數(shù)、加密解密函數(shù)等。

    配置解析函數(shù):用于解析配置文件或環(huán)境變量的函數(shù)。

    日志記錄函數(shù):處理日志記錄的工具。

    Token處理:如Token的生成、解析、驗證等。

    其他通用模塊:如錯誤處理函數(shù)、文件操作函數(shù)等。

示例

package utils

import (
    "time"
    "github.com/dgrijalva/jwt-go"
    "os"
    "errors"
)

var jwtSecret = []byte(os.Getenv("JWT_SECRET"))

// Claims 自定義的聲明
type Claims struct {
    UserID uint
    jwt.StandardClaims
}

// GenerateToken 生成Token
func GenerateToken(userID uint) (string, error) {
    expirationTime := time.Now().Add(24 * time.Hour)
    claims := &Claims{
        UserID: userID,
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: expirationTime.Unix(),
        },
    }
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    tokenString, err := token.SignedString(jwtSecret)
    if err != nil {
        return "", err
    }
    return tokenString, nil
}

// ParseToken 解析Token
func ParseToken(tokenString string) (*Claims, error) {
    claims := &Claims{}
    token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
        return jwtSecret, nil
    })
    if err != nil {
        return nil, err
    }
    if !token.Valid {
        return nil, errors.New("invalid token")
    }
    return claims, nil
}

Middlewares(中間件)

  • 功能:中間件目錄用于存放在HTTP請求處理過程中需要執(zhí)行的額外操作。這些操作通常在請求到達具體的業(yè)務邏輯處理之前或之后進行,主要用于請求的預處理和后處理。

  • 存放內(nèi)容:

    認證中間件:如Token驗證中間件,確保請求攜帶有效的Token。

    日志中間件:記錄請求日志,包括請求的路徑、方法、響應時間等。

    錯誤處理中間件:統(tǒng)一處理錯誤并返回標準的錯誤響應。

    CORS中間件:處理跨域請求。

    其他預處理或后處理操作:如請求限流、壓縮響應等。

示例

package middlewares

import (
    "my-gin-gorm-project/utils"
    "net/http"
    "strings"

    "github.com/gin-gonic/gin"
)

// AuthMiddleware 認證中間件
func AuthMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        tokenString := c.GetHeader("Authorization")
        if tokenString == "" {
            c.JSON(http.StatusUnauthorized, gin.H{"error": "請求頭中缺少Token"})
            c.Abort()
            return
        }

        tokenString = strings.TrimPrefix(tokenString, "Bearer ")

        claims, err := utils.ParseToken(tokenString)
        if err != nil {
            c.JSON(http.StatusUnauthorized, gin.H{"error": "無效的Token"})
            c.Abort()
            return
        }

        c.Set("userID", claims.UserID)
        c.Next()
    }
}

11. 項目運行流程

  • 配置解析和數(shù)據(jù)庫連接:在主程序入口中,首先加載配置文件并初始化數(shù)據(jù)庫連接。
  • 路由注冊:接著,注冊所有的路由。
  • 控制器和服務層的調用:當路由被訪問時,控制器會調用相應的服務層方法。
  • 數(shù)據(jù)訪問:服務層通過數(shù)據(jù)訪問層(Repository)來進行數(shù)據(jù)庫操作。

到此這篇關于gin+gorm實現(xiàn)goweb項目的示例代碼的文章就介紹到這了,更多相關gin+gorm實現(xiàn)goweb內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • golang gopm get -g -v 無法獲取第三方庫的解決方案

    golang gopm get -g -v 無法獲取第三方庫的解決方案

    這篇文章主要介紹了golang gopm get -g -v 無法獲取第三方庫的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • go代碼實現(xiàn)買房貸款月供計算的方法

    go代碼實現(xiàn)買房貸款月供計算的方法

    今天小編就為大家分享一篇關于go代碼實現(xiàn)買房貸款月供計算的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Golang切片連接成字符串的實現(xiàn)示例

    Golang切片連接成字符串的實現(xiàn)示例

    本文主要介紹了Golang切片連接成字符串的實現(xiàn)示例,可以使用Go語言中的內(nèi)置函數(shù)"String()"可以將字節(jié)切片轉換為字符串,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Go語言包管理工具Godep的用法

    Go語言包管理工具Godep的用法

    這篇文章介紹了Go語言包管理工具Godep的用法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • GoLang并發(fā)編程中條件變量sync.Cond的使用

    GoLang并發(fā)編程中條件變量sync.Cond的使用

    Go標準庫提供Cond原語的目的是,為等待/通知場景下的并發(fā)問題提供支持,本文主要介紹了Go并發(fā)編程sync.Cond的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2023-01-01
  • Golang算法問題之數(shù)組按指定規(guī)則排序的方法分析

    Golang算法問題之數(shù)組按指定規(guī)則排序的方法分析

    這篇文章主要介紹了Golang算法問題之數(shù)組按指定規(guī)則排序的方法,結合實例形式分析了Go語言數(shù)組排序相關算法原理與操作技巧,需要的朋友可以參考下
    2017-02-02
  • 一文掌握go的sync.RWMutex鎖

    一文掌握go的sync.RWMutex鎖

    這篇文章主要介紹了一文掌握go的sync.RWMutex鎖,本文是為了在面試中能快速口述RW鎖,并非為了完整解答RW鎖的機制,需要的朋友可以參考下
    2023-03-03
  • Golang Goroutine的使用

    Golang Goroutine的使用

    這篇文章主要介紹了Golang Goroutine的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Go高效率開發(fā)Web參數(shù)校驗三種方式實例

    Go高效率開發(fā)Web參數(shù)校驗三種方式實例

    這篇文章主要介紹了Go高效率開發(fā)Web參數(shù)校驗三種方式實例,需要的朋友可以參考下
    2022-11-11
  • Go調度器學習之協(xié)作與搶占詳解

    Go調度器學習之協(xié)作與搶占詳解

    如果某個G執(zhí)行時間過長,其他的G如何才能被正常調度,這就引出了接下來的話題:協(xié)作與搶占。本文將通過一些示例為大家詳細講講調度器中協(xié)作與搶占的相關知識,需要的可以參考一下
    2023-04-04

最新評論