From d375463de5009efdbddbc195e311a6fb9ad45073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=82=B2=E6=96=B0?= <2635131263@qq.com> Date: Thu, 15 Oct 2026 22:26:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor(go)!:=20=E5=88=86=E7=A6=BB=E7=BB=83?= =?UTF-8?q?=E4=B9=A0=E5=8C=BA=E4=B8=8E=E7=8B=AC=E7=AB=8B=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将现有练习及 module 文件迁移至 go/practice,保持代码和依赖不变 - 新增 go/projects 项目区说明,更新目录约定与开发命令 BREAKING CHANGE: Go 练习命令需改在 go/practice 目录下执行 --- AGENTS.md | 30 +++++++++------- README.md | 2 +- go/README.md | 30 ++++++---------- go/practice/README.md | 35 +++++++++++++++++++ .../algorithms/linkedlist/linkedlist.go | 0 go/{ => practice}/algorithms/main.go | 0 .../basics/goroutine/leak/main.go | 0 go/{ => practice}/basics/memoryEscape/main.go | 0 go/{ => practice}/basics/pprof/main.go | 0 go/{ => practice}/basics/runtime/main.go | 0 go/{ => practice}/basics/session/main.go | 0 go/{ => practice}/go.mod | 0 go/{ => practice}/go.sum | 0 .../testing/crypto/bcrypt_test.go | 0 go/{ => practice}/testing/error/error_test.go | 0 go/{ => practice}/testing/json/json_test.go | 0 go/{ => practice}/testing/net/net_test.go | 0 go/{ => practice}/testing/normal_test.go | 0 .../testing/regularMatch/regexp_test.go | 0 go/{ => practice}/testing/slice/slice_test.go | 0 go/projects/README.md | 27 ++++++++++++++ 21 files changed, 91 insertions(+), 33 deletions(-) create mode 100644 go/practice/README.md rename go/{ => practice}/algorithms/linkedlist/linkedlist.go (100%) rename go/{ => practice}/algorithms/main.go (100%) rename go/{ => practice}/basics/goroutine/leak/main.go (100%) rename go/{ => practice}/basics/memoryEscape/main.go (100%) rename go/{ => practice}/basics/pprof/main.go (100%) rename go/{ => practice}/basics/runtime/main.go (100%) rename go/{ => practice}/basics/session/main.go (100%) rename go/{ => practice}/go.mod (100%) rename go/{ => practice}/go.sum (100%) rename go/{ => practice}/testing/crypto/bcrypt_test.go (100%) rename go/{ => practice}/testing/error/error_test.go (100%) rename go/{ => practice}/testing/json/json_test.go (100%) rename go/{ => practice}/testing/net/net_test.go (100%) rename go/{ => practice}/testing/normal_test.go (100%) rename go/{ => practice}/testing/regularMatch/regexp_test.go (100%) rename go/{ => practice}/testing/slice/slice_test.go (100%) create mode 100644 go/projects/README.md diff --git a/AGENTS.md b/AGENTS.md index ee695ad..b76b75e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,27 +6,33 @@ | 目录 | 说明 | |---|---| -| `go/` | Go module `lab`(Go 1.26.2),go.mod 在该目录内 | +| `go/` | Go 代码:`practice/` 是共用 module(`module lab`)的练习区,`projects/` 各项目为独立 module | | `note/` | 个人笔记(非代码),`note/项目/` 被 gitignore | | `dart/` | 预留,尚未建立 | ## Go 约定 -- **Module 在 `go/` 目录下,不在仓库根**——所有 go 命令需在 `go/` 内执行 -- 每个叶子目录 = 一个独立小程序(`package main` + `main.go`) -- 多个小程序可并存,不同目录、各自独立 -- 主题目录(basics/concurrency/stdlib/patterns/algorithms/web/testing/project)可随时增删 -- 测试文件用 `*_test.go`,运行单个测试:`cd go && go test ./testing/ -run TestSliceAppend` +- Go 代码集中在 `go/`,目录本身不是 module,按用途分两区: + - `go/practice/`——共用 module 的练习区,`go.mod` 在该目录内(见 [go/practice/README.md](go/practice/README.md)) + - `go/projects/<项目名>/`——每个项目一个独立 module,自带 `go.mod`(见 [go/projects/README.md](go/projects/README.md)) +- **go 命令在对应 module 的根目录执行**:练习代码在 `go/practice/` 内执行;projects 每个项目在自己的目录内执行 +- 练习区中每个叶子目录通常是一个独立小程序(`package main` + `main.go`),多个小程序并存互不冲突;库包(如算法实现)与只有测试文件的包也是合法形态 +- 主题目录可随时增删;写新程序时挑最贴的主题,在里面建一个新子目录 +- 测试文件用 `*_test.go`,运行单个测试:`cd go/practice && go test ./testing/slice -run TestSliceAppend` ## 开发命令 ``` -# Go——所有命令在 go/ 目录下执行 -cd go -go run ./<主题>/<程序名>/ # 运行单个程序 -go test ./... # 运行全部测试 -go test ./testing/ -v # 运行 testing 包测试 -go mod tidy # 整理依赖 +# Go 练习——在 go/practice/ 目录下执行 +cd go/practice +go run ./basics/runtime/ # 运行单个程序 +go test ./... # 运行全部测试(部分练习阻塞/依赖环境,不保证全过) +go test ./testing/... -v # 运行 testing 包及其子包测试 +go mod tidy # 整理依赖 + +# Go projects——在 go/projects/<项目名>/ 各自目录下执行 +go run . # 运行项目(按实际入口调整) +go mod tidy # 整理依赖 ``` ## 注意事项 diff --git a/README.md b/README.md index 27f38f6..4084d4d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ## 当前语言 -- `go/` — Go(共用一个 module,约定见 [go/README.md](go/README.md)) +- `go/` — Go(分 `practice/` 练习区与 `projects/` 项目区,约定见 [go/README.md](go/README.md)) - `dart/` — Dart - `ts/` — TypeScript / JavaScript(每个实验独立 npm 项目,约定见 [ts/README.md](ts/README.md)) diff --git a/go/README.md b/go/README.md index 5210d12..8b4f087 100644 --- a/go/README.md +++ b/go/README.md @@ -1,24 +1,14 @@ -# Go 练习区 +# Go -本目录是 Go 的学习 / 练手代码,共用一个 module(`go.mod` 在本目录)。 +本目录按用途分两个区,`go/` 本身不是 module: -## 约定 - -- **每个叶子目录 = 一个独立小程序**:`package main` + `main.go`。 -- 多个小程序并存互不冲突(不同目录、各自的 `main`)。 -- 某个程序依赖太特殊时,可在它自己的目录单独 `go mod init`,脱离本 module。 - -## 主题目录 - -| 目录 | 放什么 | +| 目录 | 定位 | |---|---| -| `basics/` | 语法基础、内置类型(slice / map / chan 行为等) | -| `concurrency/` | 并发:goroutine / channel / select / context | -| `stdlib/` | 标准库练习(net/http、encoding/json、io…) | -| `patterns/` | 设计模式 | -| `algorithms/` | 数据结构与算法 | -| `web/` | net/http、Gin 等框架 | -| `testing/` | 练习 Go 测试机制(`*_test.go`、`go test`、table-driven、testify) | -| `project/` | 完整小项目(多文件) | +| [`practice/`](practice/README.md) | 练习区:共用一个 module(`go.mod` 在 `practice/` 内),语法 / 算法 / 测试等日常练手代码 | +| [`projects/`](projects/README.md) | 项目区:每个子目录是独立 module 的完整小应用,自带 `go.mod`、自行管理依赖 | -> 主题目录可随时增删。写新程序时挑最贴的主题,在里面建一个新子目录放 `main.go` 即可。 \ No newline at end of file +## 边界 + +- 写小段代码验证语言行为、练语法和标准库 → 放 `practice/` 对应主题目录。 +- 程序长成完整应用,或依赖需要独立于练习区管理 → 在 `projects/` 下新建目录,单独 `go mod init`。 +- 两个区互不包含:`practice/` 的 module 不覆盖 `projects/`,每个 projects 项目也是独立 module。 diff --git a/go/practice/README.md b/go/practice/README.md new file mode 100644 index 0000000..fcdac62 --- /dev/null +++ b/go/practice/README.md @@ -0,0 +1,35 @@ +# practice — 练习区 + +共用一个 module 的练手代码:`go.mod` 在本目录(`module lab`),所有日常练习都放这里。两区定位见 [../README.md](../README.md)。 + +## 约定 + +- 每个小程序 = 一个子目录:`package main` + `main.go`,多个小程序并存互不冲突(不同目录、各自的 `main`)。 +- 库包与测试包同样是合法形态:算法实现可以只提供库(如 `algorithms/linkedlist/`),`testing/` 下多为只有 `*_test.go` 的测试包。 +- 测试文件用 `*_test.go`,与被测代码同目录或独立成子包均可。 +- 程序长成完整应用、依赖需要独立管理时,移到 [`../projects/`](../projects/README.md) 单独 `go mod init`。 + +## 当前主题 + +| 目录 | 放什么 | +|---|---| +| `basics/` | 语法基础、内置类型行为(slice/map、runtime、pprof、goroutine 泄漏等) | +| `algorithms/` | 数据结构与算法(含可复用的库包,如 `linkedlist/`) | +| `testing/` | 练习 Go 测试机制,按点分子包:table-driven、regexp、net、crypto、json、error 等 | + +主题目录可随时增删:想练并发、标准库、设计模式、Web 时,直接新建 `concurrency/`、`stdlib/`、`patterns/`、`web/` 等目录即可。 + +## 常用命令 + +以下示例从仓库根目录开始执行: + +```bash +cd go/practice +go run ./basics/runtime/ # 运行单个程序 +go test ./... # 运行全部测试(不保证全过,见下方说明) +go test ./testing/... -v # testing 包及其子包的全部测试 +go test ./testing/slice -run TestSliceAppend -v # 运行单个测试 +go mod tidy # 整理依赖 +``` + +> 注意:练习代码中含阻塞(如 channel 永久等待)或依赖环境(如反向 DNS)的测试示例,`go test ./...` 不保证全部通过;验证单个练习可用 `go test ./testing/slice -run TestSliceAppend`。 diff --git a/go/algorithms/linkedlist/linkedlist.go b/go/practice/algorithms/linkedlist/linkedlist.go similarity index 100% rename from go/algorithms/linkedlist/linkedlist.go rename to go/practice/algorithms/linkedlist/linkedlist.go diff --git a/go/algorithms/main.go b/go/practice/algorithms/main.go similarity index 100% rename from go/algorithms/main.go rename to go/practice/algorithms/main.go diff --git a/go/basics/goroutine/leak/main.go b/go/practice/basics/goroutine/leak/main.go similarity index 100% rename from go/basics/goroutine/leak/main.go rename to go/practice/basics/goroutine/leak/main.go diff --git a/go/basics/memoryEscape/main.go b/go/practice/basics/memoryEscape/main.go similarity index 100% rename from go/basics/memoryEscape/main.go rename to go/practice/basics/memoryEscape/main.go diff --git a/go/basics/pprof/main.go b/go/practice/basics/pprof/main.go similarity index 100% rename from go/basics/pprof/main.go rename to go/practice/basics/pprof/main.go diff --git a/go/basics/runtime/main.go b/go/practice/basics/runtime/main.go similarity index 100% rename from go/basics/runtime/main.go rename to go/practice/basics/runtime/main.go diff --git a/go/basics/session/main.go b/go/practice/basics/session/main.go similarity index 100% rename from go/basics/session/main.go rename to go/practice/basics/session/main.go diff --git a/go/go.mod b/go/practice/go.mod similarity index 100% rename from go/go.mod rename to go/practice/go.mod diff --git a/go/go.sum b/go/practice/go.sum similarity index 100% rename from go/go.sum rename to go/practice/go.sum diff --git a/go/testing/crypto/bcrypt_test.go b/go/practice/testing/crypto/bcrypt_test.go similarity index 100% rename from go/testing/crypto/bcrypt_test.go rename to go/practice/testing/crypto/bcrypt_test.go diff --git a/go/testing/error/error_test.go b/go/practice/testing/error/error_test.go similarity index 100% rename from go/testing/error/error_test.go rename to go/practice/testing/error/error_test.go diff --git a/go/testing/json/json_test.go b/go/practice/testing/json/json_test.go similarity index 100% rename from go/testing/json/json_test.go rename to go/practice/testing/json/json_test.go diff --git a/go/testing/net/net_test.go b/go/practice/testing/net/net_test.go similarity index 100% rename from go/testing/net/net_test.go rename to go/practice/testing/net/net_test.go diff --git a/go/testing/normal_test.go b/go/practice/testing/normal_test.go similarity index 100% rename from go/testing/normal_test.go rename to go/practice/testing/normal_test.go diff --git a/go/testing/regularMatch/regexp_test.go b/go/practice/testing/regularMatch/regexp_test.go similarity index 100% rename from go/testing/regularMatch/regexp_test.go rename to go/practice/testing/regularMatch/regexp_test.go diff --git a/go/testing/slice/slice_test.go b/go/practice/testing/slice/slice_test.go similarity index 100% rename from go/testing/slice/slice_test.go rename to go/practice/testing/slice/slice_test.go diff --git a/go/projects/README.md b/go/projects/README.md new file mode 100644 index 0000000..c08befd --- /dev/null +++ b/go/projects/README.md @@ -0,0 +1,27 @@ +# projects — 独立 module 项目区 + +每个子目录是一个**完全独立的 Go module**,用于完整的小应用:自带 `go.mod`、自行管理依赖,与 [`../practice/`](../practice/README.md) 的共用 module 互不影响。是否该放这里见 [../README.md](../README.md)。 + +## 新建项目 + +以下命令从仓库根目录开始执行: + +```bash +mkdir go/projects/myapp && cd go/projects/myapp +go mod init example.com/myapp +``` + +`example.com/myapp` 仅为示例,需替换:本地练手可任意取名;打算对应真实仓库时按实际路径选择(如 `github.com/<用户名>/lab/go/projects/myapp`)。 + +之后按需创建 `main.go`(或 `cmd/<名>/main.go` 等布局)即可,不需要额外脚手架。 + +## 运行与维护 + +Go 命令一律在**该项目自己的目录**(module 根)下执行;以下示例从仓库根目录开始: + +```bash +cd go/projects/myapp +go run . # 运行(按项目实际入口调整) +go test ./... # 运行测试 +go mod tidy # 整理依赖 +```