Golang项目初始化指南:从零开始搭建项目
Golang项目初始化指南:从零开始搭建项目 我有一年的Go开发经验,但我不知道如何真正初始化一个项目。有人能告诉我吗,无论是网站资源还是您自己的实践经验都可以。
5 回复
go mod init project-name
更多关于Golang项目初始化指南:从零开始搭建项目的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你可以尝试使用 gin 进行 Web 开发。
通常,你可以从项目的根目录初始化你的项目,输入:
go mod init [域名]/[项目名称]
例如:
go mod init mycompany.com/deepai
Go项目初始化指南
1. 项目结构初始化
首先创建标准的Go项目结构:
# 创建项目目录
mkdir myproject && cd myproject
# 初始化Go模块(替换为你的模块路径)
go mod init github.com/yourusername/myproject
# 创建标准目录结构
mkdir -p cmd/ internal/ pkg/ api/ configs/ scripts/ build/ deployments/
mkdir -p test/ web/ static/ docs/ examples/
2. 基础文件配置
创建main.go入口文件:
// cmd/myproject/main.go
package main
import (
"context"
"log"
"os"
"os/signal"
"syscall"
"time"
"github.com/yourusername/myproject/internal/app"
"github.com/yourusername/myproject/internal/config"
)
func main() {
// 加载配置
cfg, err := config.Load()
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
// 创建应用
application, err := app.New(cfg)
if err != nil {
log.Fatalf("Failed to create app: %v", err)
}
// 优雅关闭
ctx, stop := signal.NotifyContext(context.Background(),
os.Interrupt, syscall.SIGTERM)
defer stop()
// 启动应用
if err := application.Run(ctx); err != nil {
log.Fatalf("Application error: %v", err)
}
}
3. 配置文件示例
创建配置结构:
// internal/config/config.go
package config
import (
"github.com/spf13/viper"
)
type Config struct {
Server ServerConfig `mapstructure:"server"`
Database DatabaseConfig `mapstructure:"database"`
Log LogConfig `mapstructure:"log"`
}
type ServerConfig struct {
Port int `mapstructure:"port"`
ReadTimeout time.Duration `mapstructure:"read_timeout"`
WriteTimeout time.Duration `mapstructure:"write_timeout"`
}
type DatabaseConfig struct {
Host string `mapstructure:"host"`
Port int `mapstructure:"port"`
User string `mapstructure:"user"`
Password string `mapstructure:"password"`
DBName string `mapstructure:"dbname"`
}
type LogConfig struct {
Level string `mapstructure:"level"`
Format string `mapstructure:"format"`
}
func Load() (*Config, error) {
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
viper.AddConfigPath("./configs")
viper.SetDefault("server.port", 8080)
viper.SetDefault("server.read_timeout", "30s")
viper.SetDefault("server.write_timeout", "30s")
if err := viper.ReadInConfig(); err != nil {
return nil, err
}
var cfg Config
if err := viper.Unmarshal(&cfg); err != nil {
return nil, err
}
return &cfg, nil
}
4. Makefile构建脚本
创建Makefile:
# Makefile
.PHONY: build run test clean lint
BINARY_NAME=myproject
VERSION=$(shell git describe --tags --always --dirty)
# 构建
build:
@echo "Building $(BINARY_NAME)..."
CGO_ENABLED=0 go build -ldflags="-s -w -X main.version=$(VERSION)" \
-o bin/$(BINARY_NAME) ./cmd/myproject
# 开发运行
run:
go run ./cmd/myproject
# 测试
test:
go test -v -race ./...
# 代码检查
lint:
golangci-lint run ./...
# 清理
clean:
rm -rf bin/ coverage.out
# Docker构建
docker-build:
docker build -t $(BINARY_NAME):$(VERSION) .
# 生成Swagger文档
swagger:
swag init -g cmd/myproject/main.go -o docs/swagger
5. Docker配置
创建Dockerfile:
# Dockerfile
# 构建阶段
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" \
-o /app/bin/myproject ./cmd/myproject
# 运行阶段
FROM alpine:latest
RUN apk --no-cache add ca-certificates tzdata
WORKDIR /root/
COPY --from=builder /app/bin/myproject .
COPY --from=builder /app/configs ./configs
EXPOSE 8080
CMD ["./myproject"]
6. 依赖管理
更新go.mod并添加常用依赖:
# 添加常用开发依赖
go get -u github.com/spf13/viper
go get -u github.com/gin-gonic/gin
go get -u go.uber.org/zap
go get -u github.com/stretchr/testify
go get -u golang.org/x/tools/cmd/goimports
# 添加开发工具
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
go install github.com/swaggo/swag/cmd/swag@latest
7. 测试结构
创建基础测试示例:
// internal/app/app_test.go
package app_test
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/yourusername/myproject/internal/app"
"github.com/yourusername/myproject/internal/config"
)
func TestApp(t *testing.T) {
cfg := &config.Config{
Server: config.ServerConfig{
Port: 8080,
ReadTimeout: 30 * time.Second,
WriteTimeout: 30 * time.Second,
},
}
app, err := app.New(cfg)
assert.NoError(t, err)
assert.NotNil(t, app)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// 测试应用启动
go func() {
err := app.Run(ctx)
assert.ErrorIs(t, err, context.DeadlineExceeded)
}()
time.Sleep(100 * time.Millisecond)
}
8. Git忽略文件
创建.gitignore:
# .gitignore
# 二进制文件
bin/
dist/
# 依赖目录
vendor/
# 环境文件
.env
.env.local
# IDE文件
.vscode/
.idea/
*.swp
*.swo
# 测试输出
coverage.out
profile.out
# 临时文件
tmp/
*.log
# Go工作区
go.work
9. 代码质量工具
创建.golangci.yml:
# .golangci.yml
run:
timeout: 5m
modules-download-mode: readonly
linters:
enable:
- gofmt
- goimports
- revive
- govet
- staticcheck
- gosimple
- unused
- errcheck
- goconst
- gocyclo
- ineffassign
issues:
max-issues-per-linter: 0
max-same-issues: 0
这个初始化结构包含了生产级Go项目所需的基础组件,包括配置管理、构建脚本、容器化支持、测试框架和代码质量工具。


