大家好,我是煎鱼。
今天给大家继续介绍 Go1.24 的新特性,主要涉及垃圾回收时的注册函数机制、新增的迭代器方法、JSON 零值的优化。
改进的终结器(finalizer)
本次新版本增加的 runtime.AddCleanup 函数是一个比原有 runtime.SetFinalizer 更灵活、更高效且更不易出错的终结机制。
AddCleanup 允许为对象附加一个清理函数,该函数会在对象不可达时执行。
例如像如下案例的代码:
如果我们希望在 Example 被垃圾回收时运行一个清理函数,现在可以直接借用 runtime.AddCleanup 就可以很便捷的达到目的了。
引入 runtime.AddCleanup 函数后,如下 Go1.24 的新版本代码:
输出结果:
可以看到该函数顺利在 newExample 结束后进行垃圾回收时运行了提前注册的函数。
slog 增加丢弃标识 Discard
Go1.24 新版本中添加一个包级变量 slog.DiscardHandler(类型为 slog.Handler),用于丢弃所有日志输出。
提案如下:
图片
以前想要达到这个目的的话,slog 代码需要写成如下这样:
现在新版本后,代码直接这么写即可:
增加 strings 标准库迭代器方法
strings.Lines
Lines 函数签名:
Lines 返回字符串 s 中换行结束行 \n 的迭代器。如果 s 为空,则迭代器不会产生任何行。如果 s 不以换行结束,则最后生成的行也不会以换行结束。
该迭代器返回一个一次性使用的迭代器。
示例代码:
输出结果:
strings.SplitSeq
SplitSeq 函数签名:
SplitSeq 返回用 sep 分隔的 s 的所有子串的迭代器。该迭代器产生的字符串与 Split(s, sep) 返回的字符串相同,但不构造切片。
该迭代器返回一个一次性使用的迭代器。
示例代码:
输出结果:
strings.SplitAfterSeq
SplitAfterSeq 函数签名:
SplitAfterSeq 返回在每个 sep 实例之后分割的 s 子串的迭代器。该迭代器产生的字符串与 SplitAfter(s, sep) 返回的字符串相同,但不需要构造切片。
该迭代器返回一个一次性使用的迭代器。
示例代码:
输出结果:
strings.FieldsSeq
FieldsSeq 函数签名:
根据 unicode.IsSpace 的定义,FieldsSeq 返回围绕空白字符串分割的 s 子串的迭代器。迭代器产生的字符串与 Fields(s) 返回的字符串相同,但不需要构建切片。
示例代码:
输出结果:
strings.FieldsFuncSeq
FieldsFuncSeq 函数签名:
FieldsFuncSeq 返回围绕满足 f(c) 的 Unicode 代码点运行分割的 s 子串的迭代器。迭代器产生的字符串与 FieldsFunc(s) 返回的字符串相同,但不需要构建切片。
示例代码:
输出结果:
json.Marshal 支持省略零值
时隔近 4 年,Go 终于在 1.24 中支持 JSON 省略零值。这是很多同学在开发过程中比较烦恼的问题。这回总算是有个解决的口子了。
相关提案:
图片
以前我们使用 omitempty 标签时:
输出结果:
可以看到 birth_date 是有零值结果的。
在 Go1.24 新版本后,可以使用 omitzero 标签:
输出结果:
可以看到 JSON 后 birth_date 的零值没有了。只有 name 的值结果。符合使用预期。
总结
这次 Go1.24 还是可以的,带来了一些比较实用的新特性方法。尤其是像是 JSON 零值等用法,可以有效解决一些小痛点。