Stretto 开源项目教程
1. 项目的目录结构及介绍
Stretto 项目的目录结构如下:
stretto/
├── .github/
│ └── workflows/
├── cmd/
│ └── stretto/
├── configs/
├── docs/
├── internal/
│ ├── app/
│ │ ├── handlers/
│ │ ├── models/
│ │ └── services/
│ └── pkg/
│ ├── config/
│ ├── logger/
│ └── utils/
├── scripts/
├── tests/
└── web/
├── static/
└── templates/
目录结构介绍
- .github/workflows: 存放 GitHub Actions 的工作流配置文件。
- cmd/stretto: 项目的入口文件,包含主要的应用程序启动逻辑。
- configs: 存放项目的配置文件。
- docs: 存放项目的文档文件。
- internal/app: 包含应用程序的核心逻辑,如处理程序、模型和服务。
- internal/pkg: 包含内部使用的包,如配置、日志和工具函数。
- scripts: 存放项目的脚本文件。
- tests: 存放项目的测试文件。
- web: 存放 Web 相关的文件,如静态资源和模板文件。
2. 项目的启动文件介绍
项目的启动文件位于 cmd/stretto
目录下,主要文件是 main.go
。
main.go 文件介绍
main.go
文件是项目的入口文件,负责初始化配置、设置日志、启动 HTTP 服务器等。以下是 main.go
文件的主要内容:
package main
import (
"log"
"net/http"
"stretto/internal/app/handlers"
"stretto/internal/pkg/config"
"stretto/internal/pkg/logger"
)
func main() {
// 初始化配置
cfg, err := config.LoadConfig()
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
// 初始化日志
logger.Init(cfg.Log)
// 设置路由
mux := http.NewServeMux()
mux.HandleFunc("/", handlers.HomeHandler)
// 启动 HTTP 服务器
log.Printf("Starting server on %s", cfg.Server.Address)
if err := http.ListenAndServe(cfg.Server.Address, mux); err != nil {
log.Fatalf("Failed to start server: %v", err)
}
}
3. 项目的配置文件介绍
项目的配置文件位于 configs
目录下,主要文件是 config.yaml
。
config.yaml 文件介绍
config.yaml
文件包含了项目的各种配置选项,如服务器地址、日志级别等。以下是 config.yaml
文件的一个示例:
server:
address: ":8080"
log:
level: "info"
output: "stdout"
配置文件加载
配置文件的加载逻辑位于 internal/pkg/config
包中,主要文件是 config.go
。以下是 config.go
文件的主要内容:
package config
import (
"fmt"
"os"
"gopkg.in/yaml.v2"
)
type Config struct {
Server struct {
Address string `yaml:"address"`
} `yaml:"server"`
Log struct {
Level string `yaml:"level"`
Output string `yaml:"output"`
} `yaml:"log"`
}
func LoadConfig() (*Config, error) {
var cfg Config
file, err := os.Open("configs/config.yaml")
if err != nil {
return nil, fmt.Errorf("failed to open config file: %v", err)
}
defer file.Close()
decoder := yaml.NewDecoder(file)
if err := decoder.Decode(&cfg); err != nil {
return nil, fmt.Errorf("failed to decode config file: %v", err)
}
return &cfg, nil
}