mcpField
G
go-declarations

go-declarations

github.com/cxuu开发1861.0k 次安装19 周前更新
代码仓库

关于 go-declarations

面向 Go 开发者的声明与初始化技能,涵盖变量、常量、类型及其初始化。提供作用域、字面量、零值和常见声明问题的实用指引。

主要功能

  1. 01选择 var 或 :=
  2. 02组合相关声明
  3. 03管理变量作用域与遮蔽
  4. 04初始化结构体和映射
  5. 05格式化复合字面量与原始字符串

适用场景

  1. 01选择局部变量和包级变量的声明方式
  2. 02使用 iota 设计类似枚举的常量
  3. 03检查结构体和映射的初始化
  4. 04避免意外遮蔽内置标识符

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/cxuu/golang-skills --skill go-declarations

安装后在 Claude Code 中输入/go-declarations确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
INITIALIZATION.md
IOTA.md
LITERALS.md
SCOPE.md
SHADOWING.md
STRUCTS.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"
局部零值(有意使用)varvar filtered []int
类型与表达式不同带类型的 varvar _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 声明varvar 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