一. Go项目模块的初始化
因为这是一个 Go 项目,我们需要开启并初始化 Go Modules,这是 Go 管理依赖的核心机制。请将 your_username 替换为你的 GitHub 或 Gitee 用户名:
bash
go mod init github.com/your_username/secgo-mall
执行后,项目根目录会生成一个 go.mod 文件,它将记录你后续引入的所有第三方依赖版本。
二. 规划标准化的项目目录骨架
商城系统通常业务复杂且迭代频繁,因此在一开始就采用业内流行的 Go Standard Project Layout(Go 标准项目布局) 会非常有帮助。我们在根目录下创建一些核心分层目录:
mkdir -p cmd/secgo-mall
mkdir -p internal/api/handlers
mkdir -p internal/service
mkdir -p internal/repository
mkdir -p internal/model
mkdir -p pkg/utils
mkdir configs
这里为你简单梳理一下这些目录的职责划分:
cmd/:项目的启动入口。主程序main.go会放在cmd/secgo-mall/下。internal/:私有业务逻辑代码(Go 编译器会限制外部项目导入此目录下的包,保证业务代码的封装性)。model/:数据模型(如数据库表的结构体定义)。repository/:数据访问层(封装所有与 MySQL、Redis 等数据库交互的逻辑)。service/:核心业务逻辑层(如处理订单生成、库存扣减等逻辑)。api/handlers/:HTTP 路由控制器(接收前端请求、参数校验并调用 Service 层处理)。
pkg/:可被外部项目安全复用的公共组件包(如加密解密算法、分布式锁工具等)。configs/:存放项目的配置文件及读取配置的代码。
三. 编写你的第一段启动代码
有了骨架,我们先在 cmd/secgo-mall/main.go 中写一个最基础的入口文件,跑通项目服务。在这个例子中,我们引入目前 Go 生态中最主流的 Web 框架 Gin 作为 HTTP 引擎。
首先,在终端中下载 Gin 依赖:
go get -u github.com/gin-gonic/gin
然后,创建 cmd/secgo-mall/main.go 文件,并写入以下基础代码:
package mainimport ("log""net/http""github.com/gin-gonic/gin"
)func main() {// 创建一个带默认中间件(Logger 和 Recovery)的路由引擎r := gin.Default()// 注册一个健康检查的路由,用来测试服务是否正常运行r.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "pong","service": "Secgo-Mall is up and running!",})})log.Println("Secgo-Mall server is starting on port 8080...")// 启动服务,默认监听在 0.0.0.0:8080 端口if err := r.Run(":8080"); err != nil {log.Fatalf("Failed to start server: %v", err)}
}
现在,测试一下你的代码能否正常跑起来:
go run cmd/secgo-mall/main.go
打开浏览器,或者新建一个终端窗口使用 curl http://localhost:8080/ping 命令。如果能看到类似 {"message":"pong","service":"Secgo-Mall is up and running!"} 的返回,说明我们的基础底座已经搭建成功了!
PS C:\Users\Chuan81> curl http://localhost:8080/ping StatusCode : 200
StatusDescription : OK
Content : {"massage":"pong","service":"secgo-mall is up and running"}
RawContent : HTTP/1.1 200 OKContent-Length: 59Content-Type: application/json; charset=utf-8Date: Fri, 10 Apr 2026 06:53:20 GMT{"massage":"pong","service":"secgo-mall is up and running"}
Forms : {}
Headers : {[Content-Length, 59], [Content-Type, application/json; charset=utf-8], [Date, Fri, 10 Apr 2026 06:53:20 GMT]}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 59
