实战项目
本章节包含三个完整的实战项目,帮助你将所学知识应用到实际开发中。
项目 1: RESTful API 开发
项目概述
使用 Zoox 框架构建一个用户管理的 RESTful API。
项目结构
user-api/
├── cmd/
│ └── server/
│ └── main.go
├── internal/
│ ├── handler/
│ │ └── user.go
│ ├── service/
│ │ └── user.go
│ ├── model/
│ │ └── user.go
│ └── repository/
│ └── user.go
├── go.mod
└── README.md实现步骤
1. 初始化项目
bash
go mod init github.com/user/user-api
go get github.com/go-zoox/zoox2. 定义模型
go
// internal/model/user.go
package model
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
type CreateUserRequest struct {
Name string `json:"name" validate:"required"`
Email string `json:"email" validate:"required,email"`
}3. 实现 Repository
go
// internal/repository/user.go
package repository
import "github.com/user/user-api/internal/model"
type UserRepository struct {
users []model.User
nextID int
}
func NewUserRepository() *UserRepository {
return &UserRepository{
users: make([]model.User, 0),
nextID: 1,
}
}
func (r *UserRepository) Create(user model.User) model.User {
user.ID = r.nextID
r.nextID++
r.users = append(r.users, user)
return user
}
func (r *UserRepository) FindByID(id int) (*model.User, error) {
for _, user := range r.users {
if user.ID == id {
return &user, nil
}
}
return nil, fmt.Errorf("用户不存在")
}
func (r *UserRepository) FindAll() []model.User {
return r.users
}
func (r *UserRepository) Update(id int, user model.User) error {
for i := range r.users {
if r.users[i].ID == id {
user.ID = id
r.users[i] = user
return nil
}
}
return fmt.Errorf("用户不存在")
}
func (r *UserRepository) Delete(id int) error {
for i, user := range r.users {
if user.ID == id {
r.users = append(r.users[:i], r.users[i+1:]...)
return nil
}
}
return fmt.Errorf("用户不存在")
}4. 实现 Service
go
// internal/service/user.go
package service
import (
"github.com/user/user-api/internal/model"
"github.com/user/user-api/internal/repository"
)
type UserService struct {
repo *repository.UserRepository
}
func NewUserService(repo *repository.UserRepository) *UserService {
return &UserService{repo: repo}
}
func (s *UserService) CreateUser(req model.CreateUserRequest) (model.User, error) {
user := model.User{
Name: req.Name,
Email: req.Email,
}
return s.repo.Create(user), nil
}
func (s *UserService) GetUser(id int) (*model.User, error) {
return s.repo.FindByID(id)
}
func (s *UserService) GetAllUsers() []model.User {
return s.repo.FindAll()
}
func (s *UserService) UpdateUser(id int, req model.CreateUserRequest) error {
user := model.User{
Name: req.Name,
Email: req.Email,
}
return s.repo.Update(id, user)
}
func (s *UserService) DeleteUser(id int) error {
return s.repo.Delete(id)
}5. 实现 Handler
go
// internal/handler/user.go
package handler
import (
"net/http"
"strconv"
"github.com/go-zoox/zoox"
"github.com/user/user-api/internal/model"
"github.com/user/user-api/internal/service"
)
type UserHandler struct {
service *service.UserService
}
func NewUserHandler(service *service.UserService) *UserHandler {
return &UserHandler{service: service}
}
func (h *UserHandler) CreateUser(c *zoox.Context) {
var req model.CreateUserRequest
if err := c.BindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, zoox.H{"error": err.Error()})
return
}
user, err := h.service.CreateUser(req)
if err != nil {
c.JSON(http.StatusInternalServerError, zoox.H{"error": err.Error()})
return
}
c.JSON(http.StatusCreated, user)
}
func (h *UserHandler) GetUser(c *zoox.Context) {
id, _ := strconv.Atoi(c.Param("id"))
user, err := h.service.GetUser(id)
if err != nil {
c.JSON(http.StatusNotFound, zoox.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, user)
}
func (h *UserHandler) GetAllUsers(c *zoox.Context) {
users := h.service.GetAllUsers()
c.JSON(http.StatusOK, users)
}
func (h *UserHandler) UpdateUser(c *zoox.Context) {
id, _ := strconv.Atoi(c.Param("id"))
var req model.CreateUserRequest
if err := c.BindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, zoox.H{"error": err.Error()})
return
}
if err := h.service.UpdateUser(id, req); err != nil {
c.JSON(http.StatusNotFound, zoox.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, zoox.H{"message": "更新成功"})
}
func (h *UserHandler) DeleteUser(c *zoox.Context) {
id, _ := strconv.Atoi(c.Param("id"))
if err := h.service.DeleteUser(id); err != nil {
c.JSON(http.StatusNotFound, zoox.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, zoox.H{"message": "删除成功"})
}6. 主程序
go
// cmd/server/main.go
package main
import (
"github.com/go-zoox/zoox"
"github.com/user/user-api/internal/handler"
"github.com/user/user-api/internal/repository"
"github.com/user/user-api/internal/service"
)
func main() {
// 初始化依赖
repo := repository.NewUserRepository()
userService := service.NewUserService(repo)
userHandler := handler.NewUserHandler(userService)
// 创建应用
app := zoox.New()
// 路由定义
api := app.Group("/api/v1")
{
api.Post("/users", userHandler.CreateUser)
api.Get("/users", userHandler.GetAllUsers)
api.Get("/users/:id", userHandler.GetUser)
api.Put("/users/:id", userHandler.UpdateUser)
api.Delete("/users/:id", userHandler.DeleteUser)
}
// 启动服务器
app.Run(":8080")
}项目 2: CLI 工具开发
项目概述
使用 Cobra 框架构建一个命令行工具,用于管理待办事项。
实现步骤
1. 初始化项目
bash
go mod init github.com/user/todo-cli
go get github.com/spf13/cobra2. 实现核心功能
go
// cmd/root.go
package cmd
import (
"fmt"
"os"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "todo",
Short: "一个待办事项管理工具",
Long: "使用 todo 命令管理你的待办事项",
}
func Execute() {
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}3. 实现命令
go
// cmd/add.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var addCmd = &cobra.Command{
Use: "add",
Short: "添加待办事项",
Run: func(cmd *cobra.Command, args []string) {
if len(args) == 0 {
fmt.Println("请提供待办事项内容")
return
}
// 实现添加逻辑
fmt.Printf("已添加: %s\n", args[0])
},
}
func init() {
rootCmd.AddCommand(addCmd)
}项目 3: 微服务架构
项目概述
构建一个简单的微服务系统,包含用户服务和订单服务。
项目结构
microservices/
├── services/
│ ├── user/
│ │ └── main.go
│ └── order/
│ └── main.go
├── pkg/
│ └── common/
│ └── logger.go
└── docker-compose.yml实现要点
- 服务发现:使用 Consul 或 etcd
- API 网关:使用 Kong 或 Traefik
- 消息队列:使用 RabbitMQ 或 Kafka
- 监控:使用 Prometheus 和 Grafana
- 日志:使用 ELK 或 Loki
总结
这些实战项目涵盖了:
- RESTful API:Web 服务开发
- CLI 工具:命令行应用开发
- 微服务:分布式系统架构
通过完成这些项目,你将掌握:
- Go 语言的实际应用
- 项目组织和代码结构
- 常用框架和工具的使用
- 最佳实践的应用
继续实践,不断提升你的 Go 语言技能!
