使用Golang开发图书管理系统是掌握后端开发基础的有效方式,核心需要实现图书信息的增删改查功能,同时结合数据库完成数据的持久化存储。我们可以通过标准库搭配第三方数据库驱动快速完成开发。

项目准备与环境配置
首先需要准备开发环境,确保已经安装Golang 1.16及以上版本,同时安装MySQL数据库。我们需要使用go-sql-driver/mysql驱动来连接MySQL,执行以下命令安装依赖:
go get -u github.com/go-sql-driver/mysql
数据库表结构设计
图书管理系统的核心数据表为图书表,包含图书的基础信息字段,创建表的SQL语句如下:
CREATE TABLE `books` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL COMMENT '图书名称', `author` varchar(50) NOT NULL COMMENT '作者', `price` decimal(10,2) NOT NULL COMMENT '价格', `stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
项目结构与核心代码实现
我们采用简单的分层结构,将代码分为数据库连接、模型定义、CRUD操作三个部分。
数据库连接配置
首先在项目中创建数据库连接工具,代码如下:
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
// 定义数据库连接变量
var db *sql.DB
// 初始化数据库连接
func initDB() (err error) {
// 数据库连接字符串,替换为自己的数据库信息,若使用本地地址可保留127.0.0.1
dsn := "root:password@tcp(127.0.0.1:3306)/book_db?charset=utf8mb4"
db, err = sql.Open("mysql", dsn)
if err != nil {
return err
}
// 验证连接是否正常
err = db.Ping()
if err != nil {
return err
}
fmt.Println("数据库连接成功")
return nil
}
图书模型定义
定义图书结构体,对应数据库表的字段:
// Book 图书结构体
type Book struct {
ID int `json:"id"`
Title string `json:"title"`
Author string `json:"author"`
Price float64 `json:"price"`
Stock int `json:"stock"`
}
CRUD操作实现
接下来实现图书的增删改查四个核心操作:
新增图书(Create)
// AddBook 新增图书
func AddBook(book *Book) (err error) {
sqlStr := "INSERT INTO books(title, author, price, stock) VALUES(?,?,?,?)"
_, err = db.Exec(sqlStr, book.Title, book.Author, book.Price, book.Stock)
if err != nil {
return err
}
return nil
}
查询图书列表(Read)
// GetBookList 查询所有图书
func GetBookList() (bookList []*Book, err error) {
sqlStr := "SELECT id, title, author, price, stock FROM books"
rows, err := db.Query(sqlStr)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var book Book
err = rows.Scan(&book.ID, &book.Title, &book.Author, &book.Price, &book.Stock)
if err != nil {
return nil, err
}
bookList = append(bookList, &book)
}
return bookList, nil
}
更新图书信息(Update)
// UpdateBook 更新图书信息
func UpdateBook(book *Book) (err error) {
sqlStr := "UPDATE books SET title=?, author=?, price=?, stock=? WHERE id=?"
_, err = db.Exec(sqlStr, book.Title, book.Author, book.Price, book.Stock, book.ID)
if err != nil {
return err
}
return nil
}
删除图书(Delete)
// DeleteBook 删除图书
func DeleteBook(id int) (err error) {
sqlStr := "DELETE FROM books WHERE id=?"
_, err = db.Exec(sqlStr, id)
if err != nil {
return err
}
return nil
}
接口调用示例
我们可以编写简单的main函数测试CRUD功能是否正常:
package main
import (
"fmt"
)
func main() {
// 初始化数据库
err := initDB()
if err != nil {
fmt.Printf("数据库连接失败: %vn", err)
return
}
// 测试新增图书
newBook := &Book{
Title: "Golang编程入门",
Author: "张三",
Price: 59.9,
Stock: 100,
}
err = AddBook(newBook)
if err != nil {
fmt.Printf("新增图书失败: %vn", err)
} else {
fmt.Println("新增图书成功")
}
// 测试查询图书列表
list, err := GetBookList()
if err != nil {
fmt.Printf("查询图书失败: %vn", err)
} else {
fmt.Printf("图书列表: %vn", list)
}
}
总结
以上就是一个简单的Golang图书管理系统的完整实现,核心围绕CRUD操作和数据库集成展开。实际开发中可以根据需求扩展更多功能,比如添加图书分类、实现用户登录、增加接口参数校验等。通过这个示例可以快速理解Golang操作数据库的基本流程,掌握后端接口开发的基础逻辑。