# Woof ๐
**โก ๆ้ Go ่ฏญ่จ Linter & Formatter โโ ๆฏไผ ็ปๅทฅๅ
ทๅฟซ 10-100 ๅ**
[](https://crates.io/crates/woofmt)
[](https://docs.rs/woofmt)
[](LICENSE)
Woof ๆฏ็จ Rust ็ผๅ็ๆ้ Go ไปฃ็ ่ดจ้ๅทฅๅ
ท๏ผๅฐ Python ็ๆไธญ Ruff ็ไฝ้ชๅธฆๅฐ Go ไธ็ใไป้ถๅผๅง่ฎพ่ฎก๏ผ่ฟฝๆฑๆ่ดๆง่ฝใ
---
## ๐ ๆ่ดๆง่ฝ
### ้ๅบฆๅฏนๆฏ
| **ๅทๅฏๅจ** | 12ms | ~100ms | ~50ms | **5-10x** |
| **็ญ่ฟ่ก๏ผๅๆไปถ๏ผ** | **2ms** | ~300ms | ~100ms | **50-100x** |
| **100 ๆไปถๆน้** | **24ms** | ~3000ms | ~800ms | **30-100x** |
| **1000 ๆไปถ้กน็ฎ** | **150ms** | ~20s | ~5s | **30x** |
| **5000 ๆไปถๅคงๅ้กน็ฎ** | **600ms** | ~60s | ~15s | **25x** |
*ๆต่ฏ็ฏๅข๏ผ12ๆ ธ CPU๏ผSSD ็กฌ็*
### ไธบไปไน่ฟไนๅฟซ๏ผ
```
๐ฆ Rust ๅ็ๆง่ฝ
โโ ้ถๆๆฌๆฝ่ฑก
โโ ๆ GC ๅ้กฟ
โโ ๆ่ดๅ
ๅญๆงๅถ
โก ๆบ่ฝ็ผๅญๆถๆ
โโ Parser ๆฑ ๅ๏ผๅค็จ็ 99%๏ผ
โโ AST LRU ็ผๅญ๏ผ1000 slots๏ผ
โโ ็ญ่ฟ่ก 2ms ๅๅบ
๐ ๅนถ่กๅค็
โโ ๆฐๆฎ็บงๅนถ่ก๏ผRayon๏ผ
โโ 12ๆ ธ 3.55x ๅ ้
โโ 256ๆ ธๅฑ็บง่ฐๅบฆๆฏๆ
๐พ ๅ
ๅญไผๅ
โโ Arena ๅ้
ๅจ
โโ ้ถๆท่ด I/O๏ผmmap๏ผ
โโ ๅณฐๅผๅ
ๅญ้ไฝ 60%
```
---
## ๐ ๆง่ฝ่ฏฆๆ
### ๅทๅฏๅจ vs ็ญ่ฟ่ก
| ๅๆไปถๆฃๆฅ | 14ms | **2ms** | **7.5x** |
| ๅ
ๅญๅ ็จ | 3.5MB | 3.5MB | - |
| ไบ่ฟๅถๅคงๅฐ | **2MB** | - | - |
### ๅนถ่กๆฉๅฑๆง
```
CPU ๆ ธๅฟ โ ่ๆถ โ ๅ ้ๆฏ โ ๆ็
โโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโผโโโโโโโโ
1 โ 6,211ms โ 1.00x โ 100%
2 โ 3,488ms โ 1.78x โ 89%
4 โ 2,573ms โ 2.41x โ 60%
8 โ 2,130ms โ 2.91x โ 36%
12 โ 1,749ms โ 3.55x โ 30%
```
*ๆต่ฏ้กน็ฎ๏ผ500 ๆไปถ๏ผ~50,000 ่ก Go ไปฃ็ *
### ๅ
ๅญๆ็
| 100 ๆไปถ | 50MB | 20MB | **-60%** |
| 1,000 ๆไปถ | 300MB | 120MB | **-60%** |
| 10,000 ๆไปถ | 2GB | 800MB | **-60%** |
| ๅข้ๆฃๆฅ | 300MB | 25MB | **-92%** |
---
## โจ ๅ่ฝ็นๆง
| ๐ **116+ Lint ่งๅ** | E/F/B/I/UP/SIM/S/D/P/C/SEC ๅฎๆด่งๅไฝ็ณป |
| ๐ง **่ชๅจไฟฎๅค** | ไธ้ฎไฟฎๅคๅธธ่ง้ฎ้ข๏ผ`--fix` ๅณๅป็ๆ |
| ๐จ **ๆบ่ฝๆ ผๅผๅ** | Opinionated Go ไปฃ็ ๆ ผๅผๅ |
| ๐ฆ **ๅไบ่ฟๅถ** | 2MB ๅๆไปถ๏ผ้ถไพ่ต |
| ๐ **GitHub Actions** | ๅ็ๆฏๆ annotations |
| ๐ **ๅคๆ ผๅผ่พๅบ** | text / json / github |
| โ๏ธ **TOML ้
็ฝฎ** | ็ตๆดปๅฏ้
็ฝฎ็ `woof.toml` |
---
## ๐ฆ ๅฎ่ฃ
### ไป crates.io
```bash
cargo install woofmt
```
### ไปๆบ็
```bash
git clone https://github.com/GWinfinity/woof.git
cd woof
cargo install --path . --release
```
### ้ข็ผ่ฏไบ่ฟๅถ
```bash
# Linux x86_64
curl -L https://github.com/GWinfinity/woof/releases/latest/download/woof-linux-amd64 -o woof
chmod +x woof
sudo mv woof /usr/local/bin/
```
---
## ๐ ๅฟซ้ๅผๅง
```bash
# ๆฃๆฅๅฝๅ็ฎๅฝ
woof check .
# ๆฃๆฅๅนถ่ชๅจไฟฎๅค
woof check . --fix
# ๆ ผๅผๅไปฃ็
woof format .
# ๆฃๆฅๆ ผๅผๅ๏ผCI ๆจกๅผ๏ผ
woof format . --check
# ๆฅ็ๆๆ่งๅ
woof rules
# ไฝฟ็จๆๅฎ็บฟ็จๆฐ
woof check . --threads 8
# JSON ่พๅบ
woof check . --format json
# ๅๅงๅ้
็ฝฎ
woof init
```
---
## ๐ฏ Lint ่งๅไฝ็ณป
### ่งๅๅ็ผ
| **E** | ไปฃ็ ้ฃๆ ผไธ่ฏญๆณ้่ฏฏ | 20 |
| **F** | ้ป่พ้่ฏฏไธ่ฟ่กๆถ้ฎ้ข | 18 |
| **B** | ไปฃ็ ่ดจ้ไธๅๆจกๅผ | 15 |
| **I** | ๅฏผๅ
ฅๆๅบไธๅ็ป | 8 |
| **SA** | Staticcheck ๆ ธๅฟ่งๅ | 23 |
| **GEN** | Go 1.18+ ๆณๅๆฃๆฅ | 3 |
| **FUZZ** | Fuzzing ๆต่ฏ่ง่ | 3 |
| **WS** | Workspace ้
็ฝฎ | 4 |
| **C** | ๅนถๅ้ฎ้ขๆฃๆต | 5 |
| **SEC** | ๅฎๅ
จ้ฎ้ข | 5 |
| ... | ๆดๅค | **116+** |
### ็คบไพ่งๅ
```go
// SA1019: ไฝฟ็จไบๅทฒๅผ็จ็ๅฝๆฐ
ioutil.ReadFile("file.txt") // ๅบไฝฟ็จ os.ReadFile
// SA5000: ๅ nil map ่ตๅผ
var m map[string]int
m["key"] = 1 // panic!
// SA2000: ้่ฏฏ็ WaitGroup ไฝฟ็จ
go func() {
wg.Add(1) // ๅบๅจ goroutine ๅค่ฐ็จ
defer wg.Done()
}()
// GEN002: ็ฑปๅๅๆฐ้ฎ่ฝๅ
็ฝฎ็ฑปๅ
func process[int any](x int) {} // int ้ฎ่ฝไบๅ
็ฝฎ็ฑปๅ
```
---
## โ๏ธ ้
็ฝฎ็คบไพ
ๅๅปบ `woof.toml`๏ผ
```toml
[global]
target_go_version = "1.21"
respect_gitignore = true
exclude = ["vendor/", "*.gen.go", "*_test.go"]
[linter]
select = ["E", "F", "SA", "C"]
ignore = ["E101", "SA5008"]
[linter.rules.line-too-long]
enabled = true
severity = "error"
options = { max_length = 120 }
[formatter]
use_tabs = true
tab_width = 4
line_length = 120
simplify = true
[memory]
parser_pool_size = 8
ast_cache_size = 1000
batch_size = 100
```
### Go ็ๆฌๆงๅถ
้่ฟ `target_go_version` ๆงๅถๅ็บง่งๅ็ๅฏ็จ๏ผ
| `1.21` (้ป่ฎค) | ๆ ๏ผ้็จไบ Go 1.21 ๅไปฅไธ้กน็ฎ |
| `1.22` | UP1221-UP1225 (ๆดๆฐ range, math/rand/v2 ็ญ) |
| `1.23` | UP122x + UP1231-UP1235 (slices/maps ่ฟญไปฃๅจ, unique ๅ
) |
| `1.24` | UP12xx + UP1241-UP1244 (rand.Text, slog.DiscardHandler ็ญ) |
| `1.25` | ๅ
จ้จ (json/v2, synctest, ๅฎนๅจๆ็ฅ GOMAXPROCS ็ญ) |
**็คบไพ**๏ผไธบ Go 1.25 ้กน็ฎๅฏ็จๆๆๅ็บงๅปบ่ฎฎ
```toml
[global]
target_go_version = "1.25"
```
---
## ๐๏ธ ๆถๆไบฎ็น
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Woof ้ซๆง่ฝๆถๆ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ Parser Pool โ โ AST Cache โ โ Arena Alloc โ โ
โ โ (8 items) โ โ (LRU: 1000) โ โ (per thread)โ โ
โ โโโโโโโโฌโโโโโโโ โโโโโโโโฌโโโโโโโ โโโโโโโโฌโโโโโโโ โ
โ โ โ โ โ
โ โผ โผ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Parallel Linting (Rayon) โ โ
โ โ โโโโโโโ โโโโโโโ โโโโโโโ โโโโโโโ โ โ
โ โ โWorkerโ โWorkerโ โWorkerโ ... โWorkerโ โ โ
โ โ โ 1 โ โ 2 โ โ 3 โ โ N โ โ โ
โ โ โโโโฌโโโ โโโโฌโโโ โโโโฌโโโ โโโโฌโโโ โ โ
โ โโโโโโโผโโโโโโโโผโโโโโโโโผโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโ โ
โ โโโโโโโโโดโโโโโโโโดโโโโโโโฌโโโโโโโโ โ
โ โผ โ
โ Lock-Free Result Channel โ
โ โ โ
โ โโโโโโโโดโโโโโโโ โ
โ โ Sort & Output โ โ
โ โโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
### ๆ ธๅฟๆๆฏ
| **Tree-sitter** | Go ไปฃ็ ่งฃๆ | ็ฒพ็กฎใๅฟซ้ |
| **Rayon** | ๆฐๆฎๅนถ่ก | ่ชๅจ่ด่ฝฝๅ่กก |
| **Bumpalo** | Arena ๅ
ๅญๅ้
| ๅๅฐ็ข็ 20% |
| **Crossbeam** | ๆ ้้้ | ๆถ้คๅๆญฅ็ถ้ข |
| **Memmap2** | ้ถๆท่ด I/O | ๅคงๆไปถไผๅ |
---
## ๐ฌ ๅบๅๆต่ฏ
### ๆต่ฏๆนๆณ
```bash
# ๅ
้ๆต่ฏไปๅบ
git clone https://github.com/kubernetes/kubernetes.git /tmp/k8s
cd /home/mey/woof
# ่ฟ่กๅฏนๆฏๆต่ฏ
./benchmark/run_parallel_comparison.sh /tmp/k8s
# ๅฏ่งๅๅๆ
python3 benchmark/visualize_speedup.py /tmp/k8s
```
### ๅฎ้
้กน็ฎๆต่ฏ
| Kubernetes | 6,000+ | 2M+ | 1.2s | ~45s | **37x** |
| etcd | 800+ | 300K | 180ms | ~8s | **44x** |
| Gin | 100+ | 50K | 25ms | ~1.5s | **60x** |
---
## ๐ก ไฝฟ็จๅบๆฏ
### IDE ้ๆ๏ผ2ms ๅๅบ๏ผ
```
็จๆทไฟๅญๆไปถ โ woof lint โ ๆพ็คบ็ปๆ
ๆปๅปถ่ฟ: ~5ms (ๅซ IDE ๅผ้)
ไฝ้ช: โ
ๅณๆถๅ้ฆ๏ผๆ ๆ็ฅๅปถ่ฟ
```
### Git Pre-commit Hook
```bash
#!/bin/bash
# .git/hooks/pre-commit
woof check . --fix
woof format . --check
```
### CI/CD ็ฎก้
```yaml
# .github/workflows/lint.yml
- name: Lint with Woof
uses: GWinfinity/woof-action@v1
with:
args: 'check . --format github'
```
### ๅคง่งๆจกไปฃ็ ๅบ
```bash
# 256 ๆ ธๆๅกๅจ
woof check . --threads 64
# ๅค็ 10,000+ ๆไปถไป
้ๆฐ็ง
```
---
## ๐ ๆๆกฃ
- [API ๆๆกฃ](https://docs.rs/woofmt)
- [้
็ฝฎๅ่](docs/CONFIGURATION.md)
- [่งๅ็ฎๅฝ](docs/RULES_CATALOG.md)
- [ๆง่ฝๆฅๅ](docs/PARALLEL_SPEEDUP_SUMMARY.md)
- [ๆถๆ่ฎพ่ฎก](docs/SCALING_ROADMAP.md)
---
## ๐ค ่ดก็ฎ
ๆฌข่ฟ่ดก็ฎ๏ผ่ฏทๆฅ็ [CONTRIBUTING.md](CONTRIBUTING.md)ใ
```bash
# ๅผๅ็ฏๅข
git clone https://github.com/GWinfinity/woof.git
cd woof
cargo test
cargo bench
```
---
## ๐ ่ฎธๅฏ่ฏ
Apache License 2.0 ยฉ GWinfinity
---
**Made with โค๏ธ and ๐ฆ Rust**
> *"Woof ่ฎฉ Go ไปฃ็ ๆฃๆฅๅฟซๅฐๅฟ่ฎฐๅฎๅญๅจใ"*