Go 1.25 交互之旅

Go 1.25 计划于 8 月发布,是探索新特性的好时机。官方发布说明较枯燥,作者准备了互动版本并举例说明变化和新行为。

  • 合成时间用于测试(#synthetic-time-for-testing)testing/synctest包可用于测试超时情况,通过内部使用假时钟让测试快速通过,避免实际等待 60 秒。同时介绍了synctest.Testsynctest.Wait函数的使用,以及相关提案和提交。
  • JSON v2(#json-v2)json/v2包是json包的重大更新,有很多破坏性变化。示例展示了如何使用自定义的 marshaler 和 unmarshaler 对不同类型进行序列化和反序列化,还介绍了其他新特性,如支持 I/O 读写、嵌套对象内联等,并鼓励查看关于 v2 变化的专门文章。
  • 感知容器的 GOMAXPROCS(#container-aware-gomaxprocs)GOMAXPROCS控制 Go 调度器可用于并发执行 goroutine 的操作系统线程的最大数量。在 Go 1.5 后默认值为runtime.NumCPU。Go 程序常在容器中运行,新特性可让 Go 运行时尊重容器的 CPU 配额,设置GOMAXPROCS手动或自动更新,还可通过环境变量或函数设置默认值,并提供向后兼容的设置。
  • 绿茶垃圾收集器(#green-tea-garbage-collector):Green Tea 是为创建大量小对象且在多 CPU 核心计算机上运行的程序优化的新实验性垃圾收集器,采取不同扫描方式提高效率,减少垃圾收集开销,可通过设置GOEXPERIMENT=greenteagc启用,设计和实现可能在未来版本中变化。
  • CSRF 保护(#csrf-protection)http.CrossOriginProtection类型可防止跨站请求伪造(CSRF),通过检查Sec-Fetch-Site头和比较 Origin 与 Host 头来检测跨域请求,示例展示了如何启用和配置 CSRF 保护,以及不同情况下服务器的处理方式。
  • Go wait group,go!(#go-wait-group-go):新的WaitGroup.Go方法自动增加等待组计数器、在 goroutine 中运行函数并在完成时减少计数器,简化了使用 wait group 的代码,该实现已添加 13 年。
  • 飞行记录(#flight-recording):飞行记录是一种跟踪技术,runtime/trace#FlightRecorder类型可在 Go 中实现飞行记录,示例展示了如何配置和使用飞行记录器,以及如何保存和查看跟踪快照。
  • 更多 Root 方法(#more-root-methods)os.Root类型新增多个类似os包中的函数方法,如ChmodChown等,用于操作文件系统,os.DirFS()os.Root.FS()返回的文件系统实现了新的fs.ReadLinkFS接口,不一致的命名令人惊讶。
  • 反射类型断言(#reflective-type-assertion):新的reflect.TypeAssert函数可更 idiomatic 地将reflect.Value转换回特定类型,避免不必要的内存分配。
  • 测试属性和朋友(#test-attributes-and-friends)T.Attr方法可添加测试信息,T.Output方法可访问测试输出流,testing.AllocsPerRun函数在并行测试运行时会 panic 以帮助捕获错误。
  • 分组日志属性(#grouped-attributes-for-logging)slog.GroupAttrs函数可从给定的slog.Attr创建分组,解决slog.Group期望slog.Attr切片的问题。
  • 哈希克隆器(#hash-cloner)hash.Cloner接口定义了可返回当前状态副本的哈希函数,标准库的hash.Hash实现都提供了Clone函数。
  • 最终思考(#final-thoughts):Go 1.25 最终确定了对测试并发代码的支持,引入了主要的实验性 JSON 包,改进了运行时,添加了飞行记录器、现代 CSRF 保护、等待组快捷方式等其他改进,是一个很棒的版本,还可查看其他 Go 版本的特性或学习 Go 的相关内容并订阅获取新文章。
阅读 61
0 条评论