Go 入门实战:音乐专辑管理 API

作为 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 测试接口:

  1. 获取所有专辑:
bash 复制代码
curl http://localhost:8080/albums
  1. 获取单个专辑:
bash 复制代码
curl http://localhost:8080/albums/2
  1. 新增专辑:
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}'
相关推荐
高频因子挖掘机7 分钟前
A股分钟K线数据占内存:先缩小请求范围,还是换 DataFrame 工具?
后端·github·api
高级程序源12 分钟前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
打工仔折腾 AI25 分钟前
极空间用 Docker 部署 Photopea:网页版 PS 的私有化实践
运维·后端·python·docker·容器·langchain·ai agent 实战
掘金者阿豪1 小时前
别只会docker stats了:cAdvisor把CPU、内存、磁盘和网络监控搬进Web页面
后端
企业数字化笔记1 小时前
多租户系统从哪里开始设计?租户身份、数据隔离、权限与套餐的整体方案
java·spring boot·后端·junit
10年前端老司机1 小时前
一次业务迭代:聊聊知识库多版本可追溯审核流程怎么做
人工智能·后端·agent
邱杰4701 小时前
多 Agent 客服的短期记忆改造:用 Redis + Checkpointer 管理会话状态
后端
高级程序源1 小时前
springboot校园外卖平台13676-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·tomcat·maven·课程设计
韩振方1 小时前
删掉一个 Pod 后,谁把它补回来?
后端
Gopher_HBo1 小时前
grpc客户端调用链
后端