[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80472":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":13,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":16,"starSnapshotCount":16,"syncStatus":29,"lastSyncTime":30,"discoverSource":31},80472,"go-argus","kamalyes\u002Fgo-argus","kamalyes","零依赖 · 高性能 Go 结构体校验器","",null,"Go",140,1,91,5,0,13,46,6,0.9,"Apache License 2.0",false,"master",true,[],"2026-06-12 02:04:02","\u003Cdiv align=\"center\">\n\n# ⚡ Argus\n\n**Zero-dependency · High-performance · i18n-native Go struct validator**\n\n[![Go Reference](https:\u002F\u002Fpkg.go.dev\u002Fbadge\u002Fgithub.com\u002Fkamalyes\u002Fgo-argus.svg)](https:\u002F\u002Fpkg.go.dev\u002Fgithub.com\u002Fkamalyes\u002Fgo-argus)\n[![Go Report Card](https:\u002F\u002Fgoreportcard.com\u002Fbadge\u002Fgithub.com\u002Fkamalyes\u002Fgo-argus)](https:\u002F\u002Fgoreportcard.com\u002Freport\u002Fgithub.com\u002Fkamalyes\u002Fgo-argus)\n[![Coverage](https:\u002F\u002Fcodecov.io\u002Fgh\u002Fkamalyes\u002Fgo-argus\u002Fbranch\u002Fmaster\u002Fgraph\u002Fbadge.svg)](https:\u002F\u002Fcodecov.io\u002Fgh\u002Fkamalyes\u002Fgo-argus)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg)](LICENSE)\n\n[English](#) · [中文](README_ZH.md)\n\n\u003C\u002Fdiv>\n\n---\n\n## ✨ Features\n\n- 🚀 **Zero third-party dependencies** — Only Go standard library, supply-chain secure\n- ⚡ **Zero-reflection VarString fast path** — String variable validation bypasses `reflect` entirely, 0 heap allocations, 2~3× faster than reflection path\n- 🏷️ **97+ built-in field rules** — required, min\u002Fmax, email, IP, UUID, datetime, Luhn checksum, semver, ISBN, ISSN, BIC\u002FSWIFT, cron, Data URI, BCP 47, Ethereum\u002FBitcoin address, etc.\n- 🔗 **Cross-field rules** — range, fieldcontains, requiredWithout, etc.\n- 🌍 **i18n native support** — 9 built-in language translations (en\u002Fzh\u002Fzh-TW\u002Fja\u002Fko\u002Ffr\u002Fde\u002Fes\u002Fru), switch with one line, extensible to any language\n- 🔄 **go-playground\u002Fvalidator compatible** — Struct tag syntax and API highly compatible, minimal migration cost\n- 🧩 **JSON Schema validation** — Lightweight JSON Schema subset validation, suitable for API gateway scenarios\n- 🔒 **Concurrency safe** — Validator instances are reusable, struct compilation results auto-cached\n- 🛠️ **Custom rules** — `RegisterValidation` for custom validation functions, context propagation supported\n- 📊 **Array-style error output** — `TranslateValidationErrors` outputs serializable JSON errors\n- 🌐 **Gateway utilities** — IP allowlist\u002Fblocklist (CIDR\u002Fwildcard), HTTP status codes, headers, content types, JSON Path validation\n- 📎 **Format validation** — email, IP, UUID, base64, URL, URI (including mailto\u002Ftel), protocol, WebSocket, semver, ISBN-10\u002F13, ISSN, BIC\u002FSWIFT, cron, Data URI, BCP 47 language tags, Ethereum\u002FBitcoin addresses\n- 📦 **Generic enum validator** — `NewEnumValidator[T]` type-safe enum value validation\n- 🔀 **Tag comma escaping** — `\\,` preserves commas in parameters, `|` as alternative separator\n- 🛑 **Rule execution policy** — Short-circuit on single field failure, other fields unaffected\n\n---\n\n## 🏗️ Architecture\n\n```mermaid\ngraph TB\n    subgraph \"User Layer\"\n        APP[\"Application Code\"]\n    end\n\n    subgraph \"Root Package validator\"\n        V[\"Validate Instance\u003Cbr\u002F>Struct \u002F Var \u002F VarString\"]\n        CACHE[\"Compilation Cache\u003Cbr\u002F>structPlan\"]\n        TAGS[\"Built-in Rules\u003Cbr\u002F>87+ builtinRules\"]\n        STAGS[\"String Rules\u003Cbr\u002F>stringRuleMap\"]\n        TRANS[\"Error Translation\u003Cbr\u002F>translations.go → i18n.Lookup\"]\n        OPTS[\"Configuration\u003Cbr\u002F>Option \u002F SetLocale\"]\n        ERRORS[\"Error Model\u003Cbr\u002F>ValidationErrors\"]\n    end\n\n    subgraph \"rule Package\"\n        RPARSE[\"Tag Parsing\u003Cbr\u002F>ParseTag\"]\n        RFIELD[\"Field Path\u003Cbr\u002F>FieldByPath\"]\n        RTIME[\"Time Rules\u003Cbr\u002F>TimeValue \u002F ResolveTimeExpr\"]\n    end\n\n    subgraph \"validate Package\"\n        COMPARE[\"Comparison\u003Cbr\u002F>CompareNumbers \u002F Strings\"]\n        FORMAT[\"Format Validation\u003Cbr\u002F>Email \u002F IP \u002F URL \u002F UUID \u002F Base64\"]\n        ENUM[\"Enum Validation\u003Cbr\u002F>EnumValidator\"]\n        JSON[\"JSON Validation\u003Cbr\u002F>ValidateJSON \u002F JSONPath\"]\n        NETWORK[\"Network Validation\u003Cbr\u002F>IPSet \u002F CIDR \u002F Wildcard\"]\n        CONSTANTS[\"Message Constants\u003Cbr\u002F>constants.go\"]\n    end\n\n    subgraph \"i18n Package (Unified Translation Store)\"\n        I18N[\"i18n Core\u003Cbr\u002F>SetLocale \u002F Msg \u002F Lookup \u002F Register\"]\n        I18N_EN[\"en.go\"]\n        I18N_ZH[\"zh.go \u002F zh_tw.go\"]\n        I18N_JA[\"ja.go \u002F ko.go\"]\n        I18N_OTHER[\"fr.go \u002F de.go \u002F es.go \u002F ru.go\"]\n    end\n\n    subgraph \"schema Package\"\n        SCHEMA[\"JSON Schema\u003Cbr\u002F>ValidateJSONSchema\"]\n    end\n\n    APP --> V\n    V --> CACHE\n    V --> TAGS\n    V --> STAGS\n    V --> TRANS\n    V --> OPTS\n    V --> ERRORS\n    V --> RPARSE\n    V --> RFIELD\n    V --> RTIME\n\n    TAGS --> FORMAT\n    TAGS --> COMPARE\n    TAGS --> ENUM\n    STAGS --> FORMAT\n\n    APP --> COMPARE\n    APP --> FORMAT\n    APP --> NETWORK\n    APP --> SCHEMA\n\n    SCHEMA --> I18N\n    COMPARE --> I18N\n    FORMAT --> I18N\n    ENUM --> I18N\n    JSON --> I18N\n    NETWORK --> I18N\n\n    OPTS --> I18N\n    TRANS --> I18N\n\n    style APP fill:#e1f5fe\n    style V fill:#fff3e0\n    style STAGS fill:#ffe0b2\n    style I18N fill:#e8f5e9\n    style SCHEMA fill:#fce4ec\n```\n\n## 📦 Installation\n\n```bash\ngo get github.com\u002Fkamalyes\u002Fgo-argus\n```\n\n> Requires Go 1.21+\n\n## 🚀 Quick Start\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com\u002Fkamalyes\u002Fgo-argus\"\n)\n\ntype User struct {\n    Name  string `json:\"name\" validate:\"required,min=2,max=50\"`\n    Email string `json:\"email\" validate:\"required,email\"`\n    Age   int    `json:\"age\" validate:\"gte=0,lte=150\"`\n}\n\nfunc main() {\n    v := validator.New()\n    err := v.Struct(User{Name: \"A\", Email: \"bad\", Age: -1})\n\n    \u002F\u002F Switch language with one line\n    validator.SetLocale(\"en\")\n    messages := validator.TranslateValidationErrors(err, \"en\")\n    for _, msg := range messages {\n        fmt.Printf(\"%s: %s\\n\", msg.Field, msg.Message)\n    }\n    \u002F\u002F Register new language (9 built-in: en\u002Fzh\u002Fzh-TW\u002Fja\u002Fko\u002Ffr\u002Fde\u002Fes\u002Fru)\n    validator.RegisterI18nMessages(\"pt\", map[string]string{\n        \"required\": \"{field} é obrigatório\",\n    })\n    \u002F\u002F name: name must be at least 2 characters\n    \u002F\u002F email: email must be a valid email address\n    \u002F\u002F age: age must be greater than or equal to 0\n}\n```\n\n## ⚡ VarString Zero-Reflection Fast Path\n\nFor string variable validation, `VarString` provides a zero-allocation fast path that completely bypasses `reflect`:\n\n```go\nv := validator.New()\n\n\u002F\u002F Traditional Var path — interface{} boxing + reflect\nerr := v.Var(\"user@example.com\", \"email\")\n\n\u002F\u002F VarString zero-reflection path — direct string parameter, 0 heap allocations\nerr = v.VarString(\"user@example.com\", \"email\")\n```\n\n**How it works:**\n\n- `VarString` looks up `stringRuleMap` (zero-reflection implementations of all string-compatible rules) and calls rule functions directly with `string` parameters\n- Unsupported rules (e.g., cross-field rules like `eqfield`, `required_if`) automatically fall back to the reflect path, maintaining full compatibility\n- Errors return lightweight `stringFieldError`, which also implements the `FieldError` interface\n\n**Supported zero-reflection rules:**\n\n`required` · `min` · `max` · `len` · `eq` · `ne` · `gt` · `gte` · `lt` · `lte` · `alpha` · `alphanum` · `email` · `url` · `uri` · `ip` · `ipv4` · `ipv6` · `uuid` · `uuid3\u002F4\u002F5` · `semver` · `isbn10\u002F13` · `issn` · `bic` · `cron` · `base64` · `json` · `hostname` · `fqdn` · `mac` · `cidr` · `e164` · `lowercase` · `uppercase` · `boolean` · `number` · `datetime` · `latitude` · `longitude` · `eth_addr` · `btc_addr` · `bcp47` · `datauri` · `oneof` · `oneofci` · `contains` · `startswith` · `endswith` and 70+ more rules\n\n## 📚 Documentation\n\n| Document | Description |\n|----------|-------------|\n| [docs\u002Ftags.md](docs\u002Ftags.md) | Complete reference for all validation tags |\n| [docs\u002Fi18n.md](docs\u002Fi18n.md) | Internationalization guide |\n| [docs\u002Fexamples.md](docs\u002Fexamples.md) | Complete usage examples |\n\n---\n\n## 🔄 Migrating from go-playground\u002Fvalidator\n\nArgus's struct tag syntax and core API are highly compatible with `go-playground\u002Fvalidator`:\n\n```go\n\u002F\u002F go-playground\u002Fvalidator\nimport \"github.com\u002Fgo-playground\u002Fvalidator\u002Fv10\"\nv := validator.New()\n\n\u002F\u002F Argus — just change the import path\nimport \"github.com\u002Fkamalyes\u002Fgo-argus\"\nv := validator.New()\n```\n\nKey differences:\n\n| Feature | go-playground\u002Fvalidator | Argus |\n|---------|------------------------|-------|\n| Third-party dependencies | Multiple (e.g., utranslator) | **Zero** |\n| i18n | Requires extra translator install | **9 built-in languages** |\n| JSON Schema | Not supported | **Built-in** |\n| IP\u002FCIDR\u002FNetwork | Not supported | **Built-in** |\n| Zero-reflection string validation | Not supported | **VarString 0 allocs** |\n\n---\n\n## 🚀 Performance Benchmarks\n\nFull performance comparison between Argus and `go-playground\u002Fvalidator\u002Fv10` is available at [go-argus-benchmark](https:\u002F\u002Fgithub.com\u002Fkamalyes\u002Fgo-argus-benchmark).\n\n### VarString Zero-Reflection Path vs Var Reflection Path\n\n| Rule | VarString (zero-reflect) | Var (reflect) | VarString Speedup |\n|------|-------------------------|---------------|-------------------|\n| `required` | **18 ns** \u002F 0 B \u002F 0 allocs | 49 ns \u002F 16 B \u002F 1 alloc | **2.7×** |\n| `email` | **47 ns** \u002F 0 B \u002F 0 allocs | 81 ns \u002F 16 B \u002F 1 alloc | **1.7×** |\n| `url` | **37 ns** \u002F 0 B \u002F 0 allocs | 64 ns \u002F 16 B \u002F 1 alloc | **1.7×** |\n| `semver` | **28 ns** \u002F 0 B \u002F 0 allocs | 57 ns \u002F 16 B \u002F 1 alloc | **2.0×** |\n| `isbn10` | **25 ns** \u002F 0 B \u002F 0 allocs | 60 ns \u002F 16 B \u002F 1 alloc | **2.4×** |\n| `cron` | **44 ns** \u002F 0 B \u002F 0 allocs | 74 ns \u002F 16 B \u002F 1 alloc | **1.7×** |\n\n### Argus vs go-playground\u002Fvalidator\u002Fv10\n\n| Scenario | Argus | validator\u002Fv10 | Advantage |\n|----------|------:|--------------:|:---------:|\n| `Var_Email_Valid` | **87 ns** \u002F 0 B \u002F 0 allocs | 626 ns \u002F 98 B \u002F 5 allocs | 🚀 **7.2×** |\n| `NestedWorkspace_Valid_Parallel` | **171 ns** \u002F 192 B \u002F 5 allocs | 768 ns \u002F 1007 B \u002F 33 allocs | 🚀 **4.5×** |\n| `NestedWorkspace_Valid` | **1014 ns** \u002F 192 B \u002F 5 allocs | 3249 ns \u002F 992 B \u002F 33 allocs | 🚀 **3.2×** |\n| `SimpleUser_Valid` | **341 ns** \u002F 0 B \u002F 0 allocs | 810 ns \u002F 98 B \u002F 5 allocs | 🚀 **2.4×** |\n\n> Key optimizations: zero-reflection VarString fast path, hand-written email parser replacing `net\u002Fmail`, pre-compiled rule dispatch table, `sync.Pool` error object reuse, zero-allocation `isEmptyValue`, zero-allocation lowercase\u002Fuppercase byte checks, `json.NewDecoder` replacing `json.Valid`, lightweight URL\u002FURI parsing replacing `net\u002Furl`, etc. See [go-argus-benchmark](https:\u002F\u002Fgithub.com\u002Fkamalyes\u002Fgo-argus-benchmark) for details.\n\n---\n\n## 🔗 Ecosystem\n\n| Project | Description |\n|---------|-------------|\n| [go-rpc-gateway](https:\u002F\u002Fgithub.com\u002Fkamalyes\u002Fgo-rpc-gateway) | Next-gen enterprise microservice gateway framework with built-in Argus as gRPC\u002FHTTP parameter validation engine |\n| [go-pbmo](https:\u002F\u002Fgithub.com\u002Fkamalyes\u002Fgo-pbmo) | High-performance Protocol Buffer ↔ Model bidirectional conversion library with Argus field-level validation |\n| [go-sqlbuilder](https:\u002F\u002Fgithub.com\u002Fkamalyes\u002Fgo-sqlbuilder) | Generic GORM repository layer using Argus to validate query parameters and model fields |\n| [go-toolbox](https:\u002F\u002Fgithub.com\u002Fkamalyes\u002Fgo-toolbox) | Zero-dependency high-performance Go utility library with Argus validation for HTTP parameters, strings, and data structures |\n\n### go-rpc-gateway Integration\n\n[go-rpc-gateway](https:\u002F\u002Fgithub.com\u002Fkamalyes\u002Fgo-rpc-gateway) integrates Argus out of the box, providing struct tag-based gRPC interceptors. Combined with `protoc-go-inject-tag` to inject `validate:\"...\"` tags on generated pb code, no manual parameter validation needed:\n\n```go\nimport \"github.com\u002Fkamalyes\u002Fgo-rpc-gateway\u002Fmiddleware\"\n\n\u002F\u002F gRPC Unary interceptor — auto-validates validate tags on req\nunary := middleware.StructTagValidatorUnaryInterceptor()\n\n\u002F\u002F gRPC Stream interceptor — auto-validates each stream message\nstream := middleware.StructTagValidatorStreamInterceptor()\n```\n\nValidation failures automatically return `codes.InvalidArgument`. Fields without injected tags are skipped, no false positives.\n\n---\n\n## 📄 License\n\n[MIT License](LICENSE)\n","Argus 是一个零依赖的高性能 Go 结构体校验器。它利用 Go 标准库实现，确保供应链安全，并通过零反射技术对字符串变量进行快速验证，相比传统的反射方法速度提升2至3倍。该项目内置了超过97种字段规则，支持跨字段验证、国际化（含9种语言）、与 go-playground\u002Fvalidator 兼容以及轻量级JSON Schema验证等功能，适用于需要高效数据验证的各种后端服务场景，特别是API网关中的数据校验。此外，Argus 还提供了并发安全性和自定义规则注册的支持，使得开发者能够灵活扩展其功能以满足特定需求。",2,"2026-06-11 04:00:52","CREATED_QUERY"]