分类 编程 中的文章

Jetbrains 非预期 format 代码过滤

在升级到 2025.1 系列版本后,我们项目中的 .proto 文件出现了一个令人头疼的问题:仅仅修改几行内容,却引发了整个文件的大面积 format 变化。 由于我们使用的是公共 repo,我们一直非常注重 diff 的最小化,避免格式化带来的冗余变更。但这次 .proto 文件却被“悄悄”改了样子。 ❓ 发生了什么? 我们原本以为是 protobuf 插件导致的自动格式化,于是尝试关闭 .proto 文件的相关插件支持,退回纯文本模式。然而,问题依旧存在。 在多次对比 format 前后的差异后,我们终于发现—— 原来是 所有注释行最后的空格被自动移除了。 也就是说,哪怕我们只改了一行逻辑代码,整个文件中尾部有空格的注释行也被一并“清理”,导致 Git diff 看起来像是大动干戈,实际只是视觉污染。 ✅ 解决方案:添加 .editorconfig 为了彻底杜绝这类问题,我们最终采用了 .editorconfig 文件配置来控制编辑器行为。 在项目根目录下创建 .editorconfig 文件,内容如下: [*] trim_trailing_whitespace = false 这条配置的意思是:对所有文件类型,不自动清除行尾空格。 配置完成后,记得重启编辑器,确保设置生效。……

阅读全文

golang json.Marshal(error) 返回 `{}`, 问题分析与解决方案

序列化 Go 语言中的 error 接口问题:问题发现、原因与解决方案 在开发 Go 语言项目时,我们常常需要将结构体序列化为 JSON 格式。然而,当结构体中包含 error 接口时,序列化结果往往会不如预期。在这篇博客中,我们将讨论这个问题的原因,并提供两种解决方案。 问题描述 我们有一个结构体 CustomError,其中包含一个 error 类型的字段。如下所示: package main import ( "encoding/json" "fmt" ) type CustomError struct { UserID int64 Err error } func (e *CustomError) Error() string { return fmt.Sprintf("user %d: %s", e.UserID, e.Err.Error()) } func main() { var errs []CustomError errs = append(errs, CustomError{UserID: 1, Err: fmt.Errorf("error 1")}) errs = append(errs, CustomError{UserID: 2, Err: fmt.Errorf("error 2")}) errs = append(errs, CustomError{UserID: 3, Err: fmt.……

阅读全文