代码风格指南
Karmada 主要使用 Go 语言开发,遵循 Go 社区通用代码风格,并通过 golangci-lint 工具进行自动化检查。然而,不同开发者编写的代码的风格可能最终大相径庭。我们旨在补充若干 代码规范,以统一 Karmada 代码的风格,从而帮助提高整体可读性。
遵循本指南有助于新贡献者快速融入项目,减少 PR 的反复修改,并缩短维护者的审核周期,从而加速合入流程。
注意:本指南并非 Go 语言官方风格指南的替代品,而是对其的补充。所有不在本指南中提及的内容均应遵循 Go 语言官方风格指南和最佳实践。 此外,Karmada 代码库中现有的代码可能未完全符合本指南。我们鼓励在编写新代码或修改现有代码时遵循本指南,以逐步提升代码质量和一致性。
代码注释
- 所有导出的函数、方法、结构体和接口都必须有注释,注释应简洁明了地描述其功能和用途。
错误示例
func GetAnnotationValue(annotations map[string]string, annotationKey string) string {
if annotations == nil {
return ""
}
return annotations[annotationKey]
}
正确示例
// GetAnnotationValue retrieves the value via 'annotationKey' (if it exists), otherwise an empty string is returned.
func GetAnnotationValue(annotations map[string]string, annotationKey string) string {
if annotations == nil {
return ""
}
return annotations[annotationKey]
}
- 鼓励在代码内部添加注释,但应解释设计意图或复杂逻辑,而非解释显而易见的操作。
错误示例
// continue if the cluster is deleting
if !c.Cluster().DeletionTimestamp.IsZero() {
klog.V(4).Infof("Cluster %q is deleting, skip it", c.Cluster().Name)
continue
正确示例
// When cluster is deleting, we will clean up the scheduled results in the cluster.
// So we should not schedule resource to the deleting cluster.
if !c.Cluster().DeletionTimestamp.IsZero() {
klog.V(4).Infof("Cluster %q is deleting, skip it", c.Cluster().Name)
continue
接口合规性
- 所有显式实现接口的结构体,必须在代码中添加编译时接口合规性检查,以确保完整实现接口契约。
使用以下模式:
var _ InterfaceName = &StructName{}
此断言应置于结构体定义所在的文件中(通常靠近类型声明或文件顶部),确保:
1.若结构体未完整实现接口,编译阶段即报错;
2.显式表达该结构体的接口契约,提升代码可读性与可维护性。
正确示例
// Check if our workloadInterpreter implements necessary interface
var _ interpreter.Handler = &workloadInterpreter{}
// workloadInterpreter explores resource with request operation.
type workloadInterpreter struct {
decoder *interpreter.Decoder
}
函数定义
- 函数参数过多时,建议使用结构体封装参数,以提高代码可读性和可维护性。
函数参数过多时,会破坏代码的可读性。通常,函数参数不应超过 5 个。如果超过此数量,请考虑重构函数或封装参数。
- 函数签名应优先写在单行,包括参数列表和返回值。
错误示例
func Foo(
bar string,
baz int) error
正确示例
func Foo(bar string, baz int) error
安全编码规范
-
禁止存在无法修改的认证凭据(如:进程二进制中硬编码口令)。
-
如果采用解释性语言(如 Shell/Python/Perl 脚本、JSP、HTML等)实现,对于需要清理的功能,必须彻底删除,严禁使用注释行等形式仅使功能失效。
-
禁止使用私有密码算法实现加解密,包括:
- 未经过专业机构评估的、自行设计的密码算法;
- 自行定义的通过变形/字符移位/替换等方式执行的数据转换算法;
- 用编码的方式(如 Base64 编码)实现数据加密的目的的伪加密实现。 说明:在非加解密场景,出于正常业务目的使用 Base64 等编码方式或变形/移位/替换等算法不违反此条。
-
密码算法中使用到的随机数必须是密码学意义上的安全随机数。
-
禁止在系统中存储的日志、调试信息、错误提示中明文打印认证凭据(口令/私钥/预共享密钥)。
CHANGELOG (release notes)
文件路径
CHANGELOG 文件位于 Karmada 仓库的 docs/CHANGELOG 目录下。