go語言學習筆記:gin + gorm + mysql 用戶增刪改查案例入門

大家好,我是此林。

Golang 語言現在已經成為了編程的趨勢,畢竟是大廠背書嘛,Google 研發的。

目前很多云原生項目都是基于 go 來編寫的,比如:

????????Kubernetes (K8s)??容器編排系統,

????????Docker??容器化技術,

????????etcd??分布式鍵值存儲(Kubernetes 的默認存儲),

????????Prometheus??監控 & 告警系統,

????????Istio??服務網格(Service Mesh,用于流量管理、安全策略、可觀測性)

??💡 Go 的優勢??

? ??編譯速度快??(比 C++/Java 快)
? ??靜態二進制文件??(部署簡單,無依賴)
? ??原生并發支持??(goroutine + channel)

那作為一個 Javaer,我們用熟練了 springboot,gin + grom 那一套東西,上手也可以說很快。今天來看一個案例:user 增刪查改。

目錄

1. Go 安裝

2. 項目開始

2.1. 初始化配置

2.2. sql 設計

2.3. db.go 數據庫配置

2.4. user.go 實體類設計

2.5. controller 設計

2.6 main.go 主程序

3. postman 接口測試


1. Go 安裝

這個不多說,下載安裝 + 配置環境變量,筆者用的是 1.23.8 穩定版。

安裝完記得用 go env -w 配置下 mod 的國內代理,mod 相當于 Maven,是依賴管理工具。

和 java 不同,mod 是 go 語言自帶的,無需另外安裝。

?vscode 里配置插件,這里就不用笨重的 Goland 了。

2. 項目開始

2.1. 初始化配置

mkdir go-crud
cd go-crud
go mod init go-crud

然后創建下面的目錄結構

go-crud/
├── main.go
├── models/
│   └── user.go
├── controllers/
│   └── user_controller.go
├── config/└── db.go

看樣子,和 spring mvc 還有點像。

2.2. sql 設計

已經提前創建好了 user 表,四個字段:id,name,age,sex。

SQL自取。

create table users
(id   bigint unsigned auto_incrementprimary key,name longtext null,age  bigint   null,sex  bigint   null
);INSERT INTO users (name, age, sex) 
VALUES ('李四', 30, 1),('王五', 28, 0),('趙六', 22, 1);

2.3. db.go 數據庫配置

package configimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)var DB *gorm.DBfunc ConnectDB() {dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic("數據庫連接失敗:" + err.Error())}DB = dbfmt.Println("數據庫連接成功!")
}

有點陌生?別擔心,多去瀏覽瀏覽菜鳥教程的 Go 基本語法就行。

1. fmt.Println():相當于 java 里的 System.out.println()

2. dsn := "...":這是go里定義局部變量的簡化寫法

當然也可以寫成 var dsn = "...",這種定義可以作為全局或者局部變量。

或者 var dsn string = "..." 也可以,不寫明類型go會自動類型推導。

2.4. user.go 實體類設計

package modelstype User struct {Id uint `json:"id" gorm:"primaryKey"`Name string `json:"name"`Age int `json:"age"`Sex int `json:"sex"`
}
func (User) TableName() string {return "user"  // 強制表名為 "user"(而不是默認的 "users")
}

在 Go 的結構體定義中,??`json:"xxx"`?? 和 ??`gorm:"xxx"`?? 這些是 ??結構體標簽(Struct Tags)??,它們為字段提供額外的元信息(metadata),用于控制 JSON 序列化/反序列化、數據庫映射等行為。

比如json標簽:

`json:"id"`   // 指定該字段在JSON中的鍵名
`json:"-"`    // 忽略此字段(不參與JSON序列化)
`json:"name,omitempty"` // 如果字段為空值(0、""、nil等),JSON中省略此字段

詳細來說,就是如下:

type User struct {Id   uint   `json:"id" gorm:"primaryKey"`  // JSON鍵名=id,數據庫主鍵Name string `json:"name"`                  // JSON鍵名=nameAge  int    `json:"age"`                   // JSON鍵名=ageSex  int    `json:"sex"`                   // JSON鍵名=sex
}

2.5. controller 設計

package controllersimport ("go-crud/config""go-crud/models""github.com/gin-gonic/gin""net/http"
)// 創建用戶
func CreateUser(c *gin.Context) {var user models.Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}config.DB.Create(&user)c.JSON(http.StatusOK, user)
}// 查詢所有用戶
func GetUsers(c *gin.Context) {var users []models.Userconfig.DB.Find(&users)c.JSON(http.StatusOK, users)
}// 查詢單個用戶
func GetUserById(c *gin.Context) {var user models.Userid := c.Param("id")if err := config.DB.First(&user, id).Error; err != nil {c.JSON(http.StatusNotFound, gin.H{"error": "用戶未找到"})return}c.JSON(http.StatusOK, user)
}// 更新用戶
func UpdateUser(c *gin.Context) {var user models.Userid := c.Param("id")if err := config.DB.First(&user, id).Error; err != nil {c.JSON(http.StatusNotFound, gin.H{"error": "用戶未找到"})return}var input models.Userif err := c.ShouldBindJSON(&input); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}user.Name = input.Nameuser.Age = input.Ageuser.Sex = input.Sexconfig.DB.Save(&user)c.JSON(http.StatusOK, user)
}// 刪除用戶
func DeleteUser(c *gin.Context) {var user models.Userid := c.Param("id")if err := config.DB.First(&user, id).Error; err != nil {c.JSON(http.StatusNotFound, gin.H{"error": "用戶未找到"})return }config.DB.Delete(&user)c.JSON(http.StatusOK, gin.H{"message": "用戶已刪除"})
}

這里每個函數都要加 c *gin.Context,可以理解為請求request和響應response都在里邊。當做規則,記住就好。?

id := c.Param("id") 就是獲取請求中的id。

c.JSON(http.StatusOK, gin.H{"message": "用戶已刪除"}) 就是返回 json 響應,restful 規范。

?可以看到,使用了 gorm,大部分 sql 我們都不用手寫。

當然也可以使用?config.DB = config.DB.Debug() ?打印實際執行的SQL。在復雜查詢時,也是可以自定義 SQL 的。

2.6 main.go 主程序

最后一步了!

package mainimport ("go-crud/config""go-crud/controllers""go-crud/models""github.com/gin-gonic/gin"
)func main() {// 連接數據庫config.ConnectDB()// 自動遷移config.DB.AutoMigrate(&models.User{})// 設置路由r := gin.Default()r.POST("/users", controllers.CreateUser) // 創建用戶r.GET("/users", controllers.GetUsers)     // 查詢所有用戶r.GET("/users/:id", controllers.GetUserById) // 查詢單個用戶r.PUT("/users/:id", controllers.UpdateUser) // 更新用戶r.DELETE("/users/:id", controllers.DeleteUser) // 刪除用戶r.Run(":1234") // 啟動服務
}

這里無非是先初始化數據庫連接。

我們以前 springboot里,是把 mysql 連接信息寫在 yml 里,然后 spring 把它封裝為 Bean 吧?

Go 里稍微不同,要去顯式調用。

然后后面就是配置路由了,路由集中管理了,和 springboot 注解配置的形式又有點不同。

最后 r.Run() 啟動服務。

3. postman 接口測試

啟動項目:

go run main.go

?1. 查詢所有用戶

?2. 刪除用戶

3. 更新用戶

今天分享就到這里了,

我是此林,

關注我吧,帶你看不一樣的世界!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77143.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77143.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77143.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

探索亮數據Web Unlocker API:讓谷歌學術網頁科研數據 “觸手可及”

本文目錄 一、引言二、Web Unlocker API 功能亮點三、Web Unlocker API 實戰1.配置網頁解鎖器2.定位相關數據3.編寫代碼 四、Web Scraper API技術亮點 五、SERP API技術亮點 六、總結 一、引言 網頁數據宛如一座蘊藏著無限價值的寶庫,無論是企業洞察市場動態、制定…

SpringBoot整合POI實現Excel文件的導出與導入

使用 Apache POI 操作 Excel文件,系列文章: 《SpringBoot整合POI實現Excel文件的導出與導入》 《SpringMVC實現文件的上傳與下載》 《C#使用NPOI導出Excel文件》 《NPOI使用手冊》 1、Apache POI 的介紹 Apache POI 是一個基于 Java 的開源庫,專為讀寫 Microsoft Office 格…

構建用戶友好的記賬體驗 - LedgerX交互設計與性能優化實踐

構建用戶友好的記賬體驗 - LedgerX交互設計與性能優化實踐 發布日期: 2025-04-16 引言 在財務管理應用領域,技術實力固然重要,但最終決定用戶留存的往往是日常使用體驗。本文作為LedgerX技術博客的第二篇,將深入探討我們如何通過精心的交互…

如何用AI輔助軟件產品原型設計及工具推薦

以下是針對軟件產品原型設計的 AI輔助工具推薦,涵蓋國內外主流工具,結合功能特點、優劣勢及適用場景分析,并標注是否為國內軟件及付費情況: 一、國內工具推薦 1. 墨刀AI(MockingBot AI) 特點:…

MySQL的MVCC機制詳解

1. 什么是MVCC? MVCC(Multi-Version Concurrency Control,多版本并發控制)是數據庫系統中用于實現并發控制的一種技術。它通過保存數據在某個時間點的快照來實現,使得在同一個數據行上可以同時存在多個版本&#xff0…

C語言數字圖像處理---2.31統計濾波器

本文介紹空域濾波器中的一種:統計濾波器 [定義與算法] 統計濾波(Statistic Filter)定義:基于圖像處理中的鄰域統計方法,對鄰域內的像素信息進行統計,如基于均值和方差的信息,用于平滑或去噪圖像,同時保留邊緣信息。 算法步驟如下: 統計濾波器的優點和缺點主要包…

計算機視覺相機模型與標定:如何讓計算機“看懂”三維世界?

計算機視覺相機模型與標定:如何讓計算機“看懂”三維世界? 一、前言二、相機模型基礎?2.1 針孔相機模型?2.1.1 模型原理?2.1.2 代碼示例?2.2 透視變換與相機內參?2.2.1 透視變換矩陣?2.2.2 內參矩陣的作用?2.3 相機外參?2.3.1 世界坐標系與相機坐標系的轉換?2.3.2 外…

DeepSpeed ZeRO++:降低4倍網絡通信,顯著提高大模型及類ChatGPT模型訓練效率

圖1: DeepSpeed ZeRO 簡介 大型 AI 模型正在改變數字世界。基于大型語言模型 (LLM)的 Turing-NLG、ChatGPT 和 GPT-4 等生成語言模型用途廣泛,能夠執行摘要、代碼生成和翻譯等任務。 同樣,DALLE、Microsoft Designer 和 Bing Image Creator 等大型多模…

Seq2Seq - 編碼器(Encoder)和解碼器(Decoder)

本節實現一個簡單的 Seq2Seq(Sequence to Sequence)模型 的編碼器(Encoder)和解碼器(Decoder)部分。 重點把握Seq2Seq 模型的整體工作流程 理解編碼器(Encoder)和解碼器&#xff08…

Spring Boot集成MinIO的詳細步驟

1. 安裝MinIO 使用Docker部署MinIO 拉取MinIO鏡像: docker pull minio/minio 這將從Docker Hub中獲取最新的MinIO鏡像。 創建目錄: mkdir -p /home/minio/config mkdir -p /home/minio/data 這些目錄將用于持久化MinIO的數據和配置文件 創建MinIO…

基于PLC的停車場車位控制系統的設計

2.1 設計目標 本課題為基于PLC的停車場車位控制系統來設計,在此將功能確定如下: 針對8個車位的停車場進行設計將停車場分為入口處,車位處、以及出口處三個部分;每個車位都有指示燈指示當前位置是否空閑,方便司機查找空…

微服務即時通信系統---(四)框架學習

目錄 ElasticSearch 介紹 安裝 安裝kibana ES客戶端安裝 頭文件包含和編譯時鏈接庫 ES核心概念 索引(Index) 類型(Type) 字段(Field) 映射(mapping) 文檔(document) ES對比MySQL Kibana訪問ES測試 創建索引庫 新增數據 查看并搜索數據 刪除索引 ES…

除了 `task_type=“SEQ_CLS“`(序列分類),還有CAUSAL_LM,QUESTION_ANS

task_type="SEQ_CLS"是什么意思:QUESTION_ANS 我是qwen,不同模型是不一樣的 SEQ_CLS, SEQ_2_SEQ_LM, CAUSAL_LM, TOKEN_CLS, QUESTION_ANS, FEATURE_EXTRACTION. task_type="SEQ_CLS" 通常用于自然語言處理(NLP)任務中,SEQ_CLS 是 Sequence Classif…

Android ViewPager使用預加載機制導致出現頁面穿透問題

? 緣由 在應用中使用ViewPager,并且設置預加載頁面。結果出現了一些異常的現象。 我們有4個頁面,分別是4個Fragment,暫且稱為FragmentA、FragmentB、FragmentC、FragmentD,ViewPager在MainActivity中,切換時&#x…

apt3.0和apt2.0的區別

一,簡單區別 更新方式 apt2.0:一次性更新所有內容,沒有分階段更新功能。apt3.0:引入分階段更新功能,可分批推送更新包。 界面顯示 apt2.0:界面簡單,輸出信息較為雜亂,沒有彩色高亮和…

過電壓保護器與傳統的保護方式對比

過電壓保護器主要用于保護電氣設備免受大氣過電壓(如雷擊)和操作過電壓(開關動作等引發)的侵害。它通常由非線性電阻片等元件組成,利用其獨特的伏安特性工作。正常電壓下,保護器呈現高阻態,幾乎…

機器學習(3)——決策樹

文章目錄 1. 決策樹基本原理1.1. 什么是決策樹?1.2. 決策樹的基本構成:1.3. 核心思想 2. 決策樹的構建過程2.1. 特征選擇2.1.1. 信息增益(ID3)2.1.2. 基尼不純度(CART)2.1.3. 均方誤差(MSE&…

充電樁領域垂直行業大模型分布式推理與訓練平臺建設方案 - 慧知開源充電樁平臺

沒有任何廣告! 充電樁領域垂直行業大模型分布式推理與訓練平臺建設方案 一、平臺定位與核心價值 行業首個垂直化AI平臺 專為充電樁運營場景設計的分布式大模型訓練與推理基礎設施,實現"算力-算法-場景"三位一體閉環管理。 核心價值主張&am…

NLP高頻面試題(四十五)——PPO 算法在 RLHF 中的原理與實現詳解

近端策略優化(Proximal Policy Optimization, PPO)算法是強化學習領域的一種新穎且高效的策略優化方法,在近年大規模語言模型的人類反饋強化學習(Reinforcement Learning with Human Feedback, RLHF)中發揮了關鍵作用。本文將以學術嚴謹的風格,詳細闡述 PPO 算法的原理及…

C++指針和引用之區別(The Difference between C++Pointers and References)

面試題:C指針和引用有什么區 C指針和引用有什么區別? 在 C 中,指針和引用都是用來訪問其他變量的值的方式,但它們之間存在一些重要的區別。了解這些區別有助于更好地理解和使用這兩種工具。 01 指針 指針(Pointer…