大家好,我是此林。
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. 更新用戶
今天分享就到這里了,
我是此林,
關注我吧,帶你看不一樣的世界!