Loading...
Loading...
Compare original and translation side by side
Community default. A company skill that explicitly supersedesskill takes precedence.samber/cc-skills-golang@golang-code-style
社区默认规范。若公司内部有明确替代的技能规范,以公司规范为准。samber/cc-skills-golang@golang-code-style
samber/cc-skills-golang@golang-namingsamber/cc-skills-golang@golang-design-patternssamber/cc-skills-golang@golang-structs-interfaces"Clear is better than clever." — Go Proverbs
samber/cc-skills-golang@golang-namingsamber/cc-skills-golang@golang-design-patternssamber/cc-skills-golang@golang-structs-interfaces"清晰胜于机巧。" —— Go谚语
// Good — each argument on its own line, closing paren separate
mux.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) {
handleUsers(
w,
r,
serviceName,
cfg,
logger,
authMiddleware,
)
})// 规范写法——每个参数单独一行,闭合括号另起一行
mux.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) {
handleUsers(
w,
r,
serviceName,
cfg,
logger,
authMiddleware,
)
}):=varvarvar count int // zero value, set later
name := "default" // non-zero, := is appropriate
var buf bytes.Buffer // zero value is ready to use:=varvarvar count int // 零值,后续赋值
name := "default" // 非零值,使用:=更合适
var buf bytes.Buffer // 零值可直接使用null[]users := []User{} // always initialized
m := map[string]int{} // always initialized
users := make([]User, 0, len(ids)) // preallocate when capacity is known
m := make(map[string]int, len(items)) // preallocate when size is knownmake([]T, 0, 1000)null[]users := []User{} // 始终显式初始化
m := map[string]int{} // 始终显式初始化
users := make([]User, 0, len(ids)) // 已知容量时预分配空间
m := make(map[string]int, len(items)) // 已知大小時预分配空间make([]T, 0, 1000)srv := &http.Server{
Addr: ":8080",
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
}srv := &http.Server{
Addr: ":8080",
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
}func process(data []byte) (*Result, error) {
if len(data) == 0 {
return nil, errors.New("empty data")
}
parsed, err := parse(data)
if err != nil {
return nil, fmt.Errorf("parsing: %w", err)
}
return transform(parsed), nil
}func process(data []byte) (*Result, error) {
if len(data) == 0 {
return nil, errors.New("empty data")
}
parsed, err := parse(data)
if err != nil {
return nil, fmt.Errorf("parsing: %w", err)
}
return transform(parsed), nil
}elseelseifreturnbreakcontinueelseswitch// Good — default-then-override with switch (cleanest for mutually exclusive overrides)
level := slog.LevelInfo
switch {
case debug:
level = slog.LevelDebug
case verbose:
level = slog.LevelWarn
}
// Bad — else-if chain hides that there's a default
if debug {
level = slog.LevelDebug
} else if verbose {
level = slog.LevelWarn
} else {
level = slog.LevelInfo
}ifreturnbreakcontinueelseswitch// 规范写法——使用switch实现默认值+覆盖(互斥条件下最简洁)
level := slog.LevelInfo
switch {
case debug:
level = slog.LevelDebug
case verbose:
level = slog.LevelWarn
}
// 不规范写法——else-if链隐藏了默认值的存在
if debug {
level = slog.LevelDebug
} else if verbose {
level = slog.LevelWarn
} else {
level = slog.LevelInfo
}if||// Good — named booleans make intent clear
isAdmin := user.Role == RoleAdmin
isOwner := resource.OwnerID == user.ID
isPublicVerified := resource.IsPublic && user.IsVerified
if isAdmin || isOwner || isPublicVerified || permissions.Contains(PermOverride) {
allow()
}ifif err := validate(input); err != nil {
return err
}if||// 规范写法——命名布尔变量明确表达意图
isAdmin := user.Role == RoleAdmin
isOwner := resource.OwnerID == user.ID
isPublicVerified := resource.IsPublic && user.IsVerified
if isAdmin || isOwner || isPublicVerified || permissions.Contains(PermOverride) {
allow()
}ifif err := validate(input); err != nil {
return err
}switchswitch status {
case StatusActive:
activate()
case StatusInactive:
deactivate()
default:
panic(fmt.Sprintf("unexpected status: %d", status))
}switchswitch status {
case StatusActive:
activate()
case StatusInactive:
deactivate()
default:
panic(fmt.Sprintf("unexpected status: %d", status))
}samber/cc-skills-golang@golang-design-patternscontext.Contextfunc FetchUser(ctx context.Context, id string) (*User, error)
func SendEmail(ctx context.Context, msg EmailMessage) error // grouped into structsamber/cc-skills-golang@golang-design-patternscontext.Contextfunc FetchUser(ctx context.Context, id string) (*User, error)
func SendEmail(ctx context.Context, msg EmailMessage) error // 参数分组为结构体rangerangerangerange nfor _, user := range users {
process(user)
}rangerange nfor _, user := range users {
process(user)
}stringintbooltime.Timestringintbooltime.Time_ "pkg"main_ "pkg"mainstrconvfmt.Sprintf%qstrings.Builder+strconvfmt.Sprintf%qstrings.Builder+anyfunc Contains[T comparable](slice []T, target T) bool // not []anyanyfunc Contains[T comparable](slice []T, target T) bool // 不要用[]anyslicesmapsgithub.com/samber/loreflectslicesmapsgithub.com/samber/loreflectgofmtgofumptgoimportsgocriticrevivewsl_v5samber/cc-skills-golang@golang-lintergofmtgofumptgoimportsgocriticrevivewsl_v5samber/cc-skills-golang@golang-lintersamber/cc-skills-golang@golang-namingsamber/cc-skills-golang@golang-structs-interfacessamber/cc-skills-golang@golang-design-patternssamber/cc-skills-golang@golang-lintersamber/cc-skills-golang@golang-namingsamber/cc-skills-golang@golang-structs-interfacessamber/cc-skills-golang@golang-design-patternssamber/cc-skills-golang@golang-linter