作为 Go 新手,光看语法很难真正掌握编程。通过实践一个小项目,你可以同时了解 Go 基础语法、数据库操作和 Web 开发。
数据库设计
sql
CREATE DATABASE IF NOT EXISTS music_store;
USE music_store;
CREATE TABLE IF NOT EXISTS albums (
id VARCHAR(255) NOT NULL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
artist VARCHAR(255) NOT NULL,
price DECIMAL(10,2) NOT NULL
);
INSERT INTO albums (id, title, artist, price) VALUES
('1', 'Blue Train', 'John Coltrane', 56.99),
('2', 'Jeru', 'Gerry Mulligan', 17.99),
('3', 'Sarah Vaughan and Clifford Brown', 'Sarah Vaughan', 39.99);
代码示例
go
package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// Album 结构体映射到 albums 表
type Album struct {
ID string `json:"id" gorm:"primaryKey"`
Title string `json:"title"`
Artist string `json:"artist"`
Price float64 `json:"price"`
}
var db *gorm.DB
var err error
// 初始化数据库连接
func initDB() {
dsn := "root:123456@tcp(127.0.0.1:3306)/music_store"
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println("数据库连接失败:", err)
panic(err)
}
fmt.Println("数据库连接成功")
}
// 获取所有专辑
func getAlbums(c *gin.Context) {
var albums []Album
db.Find(&albums)
c.IndentedJSON(http.StatusOK, albums)
}
// 根据 ID 获取单个专辑
func getAlbumByID(c *gin.Context) {
id := c.Param("id")
var album Album
result := db.First(&album, "id = ?", id)
if result.Error != nil {
c.JSON(http.StatusNotFound, gin.H{"message": "专辑未找到"})
return
}
c.IndentedJSON(http.StatusOK, album)
}
// 新增专辑
func postAlbum(c *gin.Context) {
var newAlbum Album
if err := c.BindJSON(&newAlbum); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"message": "无效请求"})
return
}
db.Create(&newAlbum)
c.IndentedJSON(http.StatusCreated, newAlbum)
}
func main() {
initDB()
router := gin.Default()
// 路由绑定
router.GET("/albums", getAlbums)
router.GET("/albums/:id", getAlbumByID)
router.POST("/albums", postAlbum)
router.Run("localhost:8080")
}
测试 API
启动服务后,可使用 curl 测试接口:
- 获取所有专辑:
bash
curl http://localhost:8080/albums
- 获取单个专辑:
bash
curl http://localhost:8080/albums/2
- 新增专辑:
bash
curl -X POST http://localhost:8080/albums \
-H "Content-Type: application/json" \
-d '{"id":"4","title":"New Album","artist":"New Artist","price":29.99}'