{"id":21674519,"url":"https://github.com/j2gg0s/godefault","last_synced_at":"2026-04-18T07:34:26.993Z","repository":{"id":220911526,"uuid":"752908791","full_name":"j2gg0s/godefault","owner":"j2gg0s","description":"A tool auto-generating Defaulter function","archived":false,"fork":false,"pushed_at":"2024-02-05T06:11:11.000Z","size":160,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-25T09:44:42.540Z","etag":null,"topics":["default","golang","struct"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/j2gg0s.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-02-05T04:40:52.000Z","updated_at":"2024-02-05T12:54:01.000Z","dependencies_parsed_at":"2024-06-21T05:48:38.896Z","dependency_job_id":"d9e0b24f-0e4d-4d2a-978f-7aa5b76dd3b7","html_url":"https://github.com/j2gg0s/godefault","commit_stats":null,"previous_names":["j2gg0s/godefault"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j2gg0s%2Fgodefault","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j2gg0s%2Fgodefault/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j2gg0s%2Fgodefault/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j2gg0s%2Fgodefault/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/j2gg0s","download_url":"https://codeload.github.com/j2gg0s/godefault/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244583196,"owners_count":20476233,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["default","golang","struct"],"created_at":"2024-11-25T13:48:00.646Z","updated_at":"2026-04-18T07:34:21.969Z","avatar_url":"https://github.com/j2gg0s.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"一个自动化生成结构体默认函数的工具.\n主要逻辑来自 Kubernetes 的代码生成工具 [gengo](https://github.com/kubernetes/gengo/blob/master/examples/defaulter-gen/generators/defaulter.go).\n\n## 使用\n对于给定的目录, godefault 会自动扫描所有顶层结构体并生成默认函数.\n\n生成行为完全受评论中的 tag 控制.\n\n任何需要生成默认函数的包都应该在包注释中包括 `// +k8s:defaulter-gen=`.\n这个 tag 有两种用法.\n如果其值是 true|false,\n则代表应该/不应该为紧随其后的结构体生成默认函数.\n```go\n// +k8s:defaulter-gen=true\n\ntype Defaulted struct {\n```\n注意此时注释后必须紧跟空行.\n\n如果 tag 的值是其他内容, 则代表某个字段名, 工具会为所有包含这个字段的结构体生成默认函数.\n```go\n// +k8s:defaulter-gen=TypeMeta\n```\n\n字段的默认值由注释 `// +default=` 控制, 支持通过 JSON 字符串为复杂结构体赋值.\n```go\ntype Defaulted struct {\n\t// +default=\"bar\"\n\tStringDefault string\n\n\t// Default is forced to empty string\n\t// Specifying the default is a no-op\n\t// +default=\"\"\n\tStringEmptyDefault string\n\n\t// Not specifying a default still defaults for non-omitempty\n\tStringEmpty string\n\n\t// +default=\"default\"\n\tStringPointer *string\n\n\t// +default=64\n\tInt64 *int64\n\n\t// +default=32\n\tInt32 *int32\n\n\t// +default=1\n\tIntDefault int\n\n\t// +default=0\n\tIntEmptyDefault int\n\n\t// Default is forced to 0\n\tIntEmpty int\n\n\t// +default=0.5\n\tFloatDefault float64\n\n\t// +default=0.0\n\tFloatEmptyDefault float64\n\n\tFloatEmpty float64\n\n\t// +default=[\"foo\", \"bar\"]\n\tList []Item\n\t// +default={\"s\": \"foo\", \"i\": 5}\n\tSub *SubStruct\n\n\t//+default=[{\"s\": \"foo1\", \"i\": 1}, {\"s\": \"foo2\"}]\n\tStructList []SubStruct\n\n\t//+default=[{\"s\": \"foo1\", \"i\": 1}, {\"s\": \"foo2\"}]\n\tPtrStructList []*SubStruct\n\n\t//+default=[\"foo\"]\n\tStringList []string\n\n\t// Default is forced to empty struct\n\tOtherSub SubStruct\n\n\t// +default={\"foo\": \"bar\"}\n\tMap map[string]Item\n\n\t// +default={\"foo\": {\"S\": \"string\", \"I\": 1}}\n\tStructMap map[string]SubStruct\n\n\t// +default={\"foo\": {\"S\": \"string\", \"I\": 1}}\n\tPtrStructMap map[string]*SubStruct\n\n\t// A default specified here overrides the default for the Item type\n\t// +default=\"banana\"\n\tAliasPtr Item\n}\n```\n更多用例请参考 [examples](./examples/_output_tests), 其中\n`type.go` 为结构体定义,`zz_generated.go` 为生成的默认函数.\n\n你也可以通过预先定义对应函数完全自定义结构体的默认逻辑.\n\n## 安装\n```shell\ngit clone https://github.com/j2gg0s/godefault.git \u0026\u0026 cd godefault \u0026\u0026 go install .\n```\n\n## 生成\n以 [examples/_output_tests](./examples/_output_tests) 为例, type.go 为结构体定义, zz_generated.default.go 为生成的默认函数, default.go 为用户自定义的默认函数.\n```shell\ncd examples/_output_tests\ngit ls-files -cmo --exclude-standard ':!:vendor/*' -z ':(glob)**'/\"zz_generated.defaults.go\" | xargs -0 rm -f \ngodefault -i github.com/j2gg0s/godefault/examples/output_tests/... -o . --trim-path-prefix=github.com/j2gg0s/godefault/examples/output_tests\n```\n\n建议在生成之前先删除之前生成的文件, 避免 godefault 将上次生成的结果视作主动提供的默认实现.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fj2gg0s%2Fgodefault","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fj2gg0s%2Fgodefault","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fj2gg0s%2Fgodefault/lists"}