关于 go-declarations
面向 Go 开发者的声明与初始化技能,涵盖变量、常量、类型及其初始化。提供作用域、字面量、零值和常见声明问题的实用指引。
主要功能
- 01选择 var 或 :=
- 02组合相关声明
- 03管理变量作用域与遮蔽
- 04初始化结构体和映射
- 05格式化复合字面量与原始字符串
适用场景
- 01选择局部变量和包级变量的声明方式
- 02使用 iota 设计类似枚举的常量
- 03检查结构体和映射的初始化
- 04避免意外遮蔽内置标识符
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ cxuu/ golang-skills --skill go-declarations安装后在 Claude Code 中输入/go-declarations确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/INITIALIZATION.mdIOTA.mdLITERALS.mdSCOPE.mdSHADOWING.mdSTRUCTS.md详细介绍
Go 声明与初始化
兼容性:示例可能使用
any,这要求 Go 1.18+。
资源路由
references/SCOPE.md- 在决定使用var、:=、if-init 和较窄的变量作用域时阅读。references/IOTA.md- 在设计常量或类似枚举的值时阅读。references/INITIALIZATION.md- 在初始化结构体、映射、零值或指针时阅读。references/LITERALS.md- 在设置复合字面量格式或权衡是否使用字段名时阅读。references/STRUCTS.md- 在设计或初始化结构体时阅读。references/SHADOWING.md- 声明可能遮蔽内置名称或外层变量时阅读。
快速参考:var 与 :=
| 上下文 | 使用 | 示例 |
|---|---|---|
| 顶层 | var(始终) | var _s = F() |
| 局部且有值 | := | s := "foo" |
| 局部零值(有意使用) | var | var filtered []int |
| 类型与表达式不同 | 带类型的 var | var _e error = F() |
将相似声明分组
将相关的 var、const、type 放在带括号的代码块中。将
不相关的声明拆分到不同代码块中。
// Bad
const a = 1
const b = 2
// Good
const (
a = 1
b = 2
)
在函数内部,即使变量互不相关,也要将相邻的 var 分组:
var (
caller = c.name
format = "json"
timeout = 5 * time.Second
)
常量与 iota
枚举从 1 开始,这样零值就表示无效/未设置:
const (
Add Operation = iota + 1
Subtract
Multiply
)
当默认行为符合预期时,使用零值(例如 LogToStdout)。
变量作用域
如果结果只用于错误检查,使用 if-init 来限制作用域:
if err := os.WriteFile(name, data, 0644); err != nil {
return err
}
如果缩小作用域会导致嵌套层级更深,或需要在 if 外使用结果,就不要缩小作用域。仅在函数中使用的常量应移入函数内部。
初始化结构体
- 始终使用字段名(由
go vet强制检查)。例外:字段数 ≤3 的测试表。 - 省略零值字段——让 Go 设置默认值。
- 零值结构体使用
var:var user User,而不是user := User{} - 优先使用
&T{}而非new(T):sptr := &T{Name: "bar"}
复合字面量格式
对于外部包中的类型,使用字段名。结束花括号的缩进应与起始行对齐。在切片/映射字面量中省略重复的类型名
(gofmt -s)。
初始化映射
| 场景 | 使用 | 示例 |
|---|---|---|
| 为空,稍后填充 | make(map[K]V) | m := make(map[string]int) |
| nil 声明 | var | var m map[string]int |
| 初始化时包含固定条目 | 字面量 | m := map[string]int{"a": 1} |
make() 在视觉上能区分已初始化的空映射和 nil 映射。数量已知时使用容量提示。
原始字符串字面量
使用反引号字符串,避免手动转义字符:
// Bad
wantError := "unknown name:\"test\""
// Good
wantError := `unknown name:"test"`
非常适用于正则表达式、SQL、JSON 和多行文本。
优先使用 any 而非 interface{}
Go 1.18+:所有新代码中都使用 any,而不是 interface{}。
避免遮蔽内置名称
绝不要将预声明标识符(error、string、len、cap、append、
copy、new、make、close、delete、panic、recover、any、true、
false、nil、iota)用作名称。使用 go vet 检测。
// Bad — shadows the builtin
var error string
// Good
var errorMessage string
相关技能
- 命名约定:选择变量名、常量名,或根据作用域决定名称长度时,参见 go-naming
- 数据结构:在
new和make之间做选择,或初始化切片和映射时,参见 go-data-structures - 控制流作用域:使用 if-init、
:=重新声明或避免变量遮蔽时,参见 go-control-flow - 容量提示:为已知大小的映射或切片预分配容量时,参见 go-performance
评论
支持 Markdown