SUNKAIS OS · READ ONLY

Jarvis

登录后,可以询问自己的任务、项目和记录。

登录后使用
Sun KaisPersonal Research Institute · 私人研究机构

Mathematics · Computational Science · Engineering · Personal Knowledge Systems

更多
SUNKAIS · PERSONAL OS

搜索全站功能

选择 前往

LANG-07 · PROGRAMMING WORKBENCH

Go

用小接口、显式错误和 goroutine 构建简单可靠的网络工具。

从模块、切片、接口与 context 进入 Go,以 gofmt、go test、race detector 和 pprof 形成标准工程闭环。

MENTAL MODEL / 心智模型

先建立正确的程序直觉

goroutine 很轻但不是免费;并发必须有取消、背压和回收路径,错误是普通值并应在边界添加上下文。

CODE REPOSITORY / 代码仓库锚点

从可测试的目录开始

go-project/
├─ go.mod
├─ go.sum
├─ cmd/memory-tools/main.go
├─ internal/task/service.go
└─ internal/task/service_test.go

QUICK START / 第一条命令

先跑通最小闭环

go mod init example.com/memory-tools && go run ./cmd/memory-tools

LEARNING ROUTE / 学习路径

从写出代码到守住生产边界

每个节点都包含可复制示例、判断原则与常见陷阱。

01常用方法切片、接口与错误02工程结构cmd、internal 与包边界03构建运行标准工具链与交叉构建04依赖管理Modules 与版本图05调试测试表驱动测试、race 与 pprof06错误诊断nil、并发泄漏与接口陷阱07安全边界HTTP、命令与资源限制
01常用方法

切片、接口与错误

接受小接口、返回具体类型,错误通过包装保留上下文。

包装错误代码示例
data, err := os.ReadFile(path)
if err != nil {
    return nil, fmt.Errorf("read config %q: %w", path, err)
}

%w 保留错误链,调用者可以 errors.Is/As 判断根因。

上下文取消代码示例
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil { return err }
resp, err := client.Do(req)

context 从入口传递,不存入长期结构体;外部 I/O 应有 deadline。

02工程结构

cmd、internal 与包边界

main 负责装配,internal 防止外部导入,包围绕单一职责命名。

模块初始化终端命令
go mod init example.com/memory-tools
go mod tidy

模块路径是导入身份;发布公共模块后不应随意改变。

入口结构代码示例
func main() {
    if err := run(context.Background(), os.Args[1:]); err != nil {
        log.Printf("error: %v", err)
        os.Exit(1)
    }
}

把可测试逻辑放入返回 error 的 run,main 只处理进程退出。

03构建运行

标准工具链与交叉构建

gofmt、vet、test 和 build 都来自统一 Go 工具链。

日常验证终端命令
gofmt -w .
go vet ./...
go test ./...
go build ./cmd/memory-tools

CI 中格式检查可比较 gofmt 输出而不是修改文件。

交叉构建终端命令
$env:GOOS="linux"; $env:GOARCH="amd64"; go build ./cmd/memory-tools

这是 PowerShell 示例;涉及 cgo 时还需要目标平台 C 工具链。

04依赖管理

Modules 与版本图

提交 go.mod/go.sum,用最小版本选择解析依赖并审阅升级。

查看与升级终端命令
go list -m all
go list -m -u all
go get example.com/module@v1.2.3
go mod tidy

升级后检查 release notes 并运行测试、race 与集成验证。

解释依赖来源终端命令
go mod why -m example.com/module

显示主模块为何需要该模块,便于清理与审计。

05调试测试

表驱动测试、race 与 pprof

用表驱动覆盖输入矩阵,用 race detector 检查并发访问。

表驱动测试代码示例
for _, tc := range []struct { in string; want int }{{"2", 2}, {" 5 ", 5}} {
    t.Run(tc.in, func(t *testing.T) {
        if got := parse(tc.in); got != tc.want { t.Fatalf("got %d", got) }
    })
}

循环变量语义依 Go 版本而不同;并行子测试仍应明确捕获所需值。

测试与竞态终端命令
go test ./... -cover
go test -race ./...

race 会显著变慢,只检测实际执行路径;为并发分支补充分层测试。

06错误诊断

nil、并发泄漏与接口陷阱

错误值必须处理,goroutine 必须知道如何退出。

all goroutines are asleep诊断清单
检查无接收者发送、无发送者接收、WaitGroup 计数、未关闭通道和持锁阻塞;采集 goroutine dump。

关闭通道通常由发送方负责;不要为“通知完成”随意关闭共享通道。

接口不为 nil诊断清单
接口包含动态类型和值;装入 typed nil 指针后接口本身不等于 nil。返回 error 时直接 return nil。

调试时同时打印接口动态类型和值。

07安全边界

HTTP、命令与资源限制

为服务器配置超时、请求上限和取消路径,避免无限 goroutine 与内存增长。

服务器超时代码示例
server := &http.Server{
    Addr: ":8080", Handler: handler,
    ReadHeaderTimeout: 5 * time.Second,
    ReadTimeout: 15 * time.Second, WriteTimeout: 15 * time.Second,
}

还应限制请求体、并发、上传和下游调用时间。

安全清单诊断清单
SQL 参数化;exec.Command 分离参数;路径限制在可信根目录;随机数按安全用途选择 crypto/rand;秘密不写日志。

接口小和内存安全不自动解决授权、注入或拒绝服务。

PRIVATE CODE VAULT / 私人代码仓库

Go 私人代码与伪代码仓库

把 Go 的练习、工程片段、算法伪代码、验证说明与历史版本保存在登录后的私人空间。

TEXT ONLYRLS PRIVATENO EXECUTION
这里只归档,不运行代码。支持导入与下载纯文本源码;`.mlx`、`.xlsx`、`.accdb` 等二进制容器不会入库。密码、Token、私钥等秘密也会被拒绝,请改用环境变量。
PRIVATE SESSION REQUIRED

登录后打开你的私人仓库

游客只看到这个说明,不会收到、缓存或渲染任何私人源码。

安全登录

REFERENCE SOURCES / 官方与高质量资料

版本差异优先以官方文档为准

先在本站找回路径,再进入原始文档确认版本、平台和完整前置条件。

DELIVERY LOOP / 练习闭环

把每次练习变成可以重新运行的资产

  1. 01 · 定义写清输入、输出、边界与失败行为。
  2. 02 · 最小实现先让单一案例从命令行完整运行。
  3. 03 · 验证增加边界测试、调试信息与质量检查。
  4. 04 · 沉淀提交代码、README、依赖清单和复现命令。