当前位置: 首页 > news >正文

【Go】:深入解析 Go 1.24:新特性、改进与最佳实践

前言

Go 1.24 尚未发布。这些是正在进行中的发布说明。Go 1.24 预计将于 2025 年 2 月发布。本文将深入探讨 Go 1.24 中引入的各项更新,并通过具体示例展示这些变化如何影响日常开发工作,确保为读者提供详尽而有价值的参考。

新特性及改进综述

HTTP/2 协议支持(HTTP/2 Protocol Support)

  • 非加密 HTTP/2:现在可以通过配置 Server.Protocols 和 Transport.Protocols 字段来启用不加密的 HTTP/2 连接。这意味着服务器可以在未加密端口上接受 HTTP/2 请求,并且客户端可以针对 http:// URL 使用不加密的 HTTP/2。
  • 先验知识模式:使用了“HTTP/2 with Prior Knowledge”(RFC 9113, section 3.3),不再支持已废弃的 “Upgrade: h2c” 头部。
  • 多路复用传输层协议 (MPTCP):默认情况下,在支持 MPTCP 的系统(目前仅限于 Linux)上启用了 MPTCP,以提高网络连接的可靠性和带宽利用率。

示例代码:非加密 HTTP/2 服务器

package mainimport ("fmt""net/http"
)func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello from unencrypted HTTP/2!")
}func main() {mux := http.NewServeMux()mux.HandleFunc("/", handler)// 配置 HTTP/2 协议选项server := &http.Server{Addr: ":8080",Handler: mux,Protocols: []string{"h2", "http/1.1"},}fmt.Println("Starting server on :8080")if err := server.ListenAndServe(); err != nil {fmt.Printf("Server failed: %v\n", err)}
}

编码接口扩展(Encoding Interface Extensions)

  • BinaryAppender 和 TextAppender 接口:多个标准库类型实现了新的 encoding.BinaryAppender 和 encoding.TextAppender 接口,允许直接将数据追加到现有切片中,而不是每次分配新的切片。这包括但不限于 Addr, AddrPort, Prefix, URL, Regexp, Float, Int, Rat 等。
  • New 函数返回值:New 函数的结果也实现了上述接口,如 crypto/cipher.NewCipher, math/big.New, hash.Hash.New 等。

示例代码:编码接口扩展示例

package mainimport ("encoding/json""fmt""net/url"
)func main() {u := url.URL{Scheme: "https", Host: "example.com", Path: "/test"}var b []byteappender := u.(encoding.TextAppender)appender.AppendText(&b)fmt.Println(string(b))jsonBytes, _ := json.Marshal(u)fmt.Println(string(jsonBytes))
}

Windows 平台增强(Windows Platform Enhancements)

  • Nano Server 支持:user.Current() 方法现在可以在 Windows Nano Server 上使用,并避免了对 NetApi32 库的依赖,因为该库在 Nano Server 中不可用。
  • 内置服务账户支持:user.Current(), user.Lookup(), 和 user.LookupId() 方法现在支持以下内置服务账户:NT AUTHORITY\SYSTEM, NT AUTHORITY\LOCAL SERVICE, NT AUTHORITY\NETWORK SERVICE。
  • 性能提升:当当前用户属于慢速域时,user.Current() 的执行速度显著加快,从原来的几秒甚至几分钟缩短到了毫秒级别。
  • 线程身份模拟:如果当前线程正在模拟其他用户,则 user.Current() 将返回进程所有者用户的信息,而不是抛出错误。

示例代码:Windows 平台增强示例

package mainimport ("fmt""os/user"
)func main() {currentUser, err := user.Current()if err != nil {fmt.Println("Error:", err)return}fmt.Printf("Current User: %+v\n", currentUser)
}

标准库迭代器(Standard Library Iterators)

  • 字符串和字节包中的迭代器函数:strings 和 bytes 包新增了几种基于迭代器的工作方式,如 Lines, SplitSeq, SplitAfterSeq, FieldsSeq, FieldsFuncSeq,用于处理字符串或字节序列的不同分割需求。
  • 效率提升:这些迭代器函数提高了操作字符串和字节序列的效率,减少了内存分配次数。

示例代码:字符串迭代器示例

package mainimport ("fmt""strings"
)func main() {text := "Hello, world!"linesIter := strings.Lines(text)for line := range linesIter {fmt.Println(line)}fieldsIter := strings.FieldsSeq(text, " ")for field := range fieldsIter {fmt.Println(field)}
}

安全性和稳定性改进(Security and Stability Improvements)

  • 随机数生成器:crypto/rand.Reader 在某些平台上利用了更快速的底层 API(例如 Linux 6.11 及以上版本的 getrandom vDSO),同时保证不会失败。此外,对于 Linux 内核低于 3.17 的情况,仍然会打开 /dev/urandom 文件。
  • 密钥大小限制:所有签名、验证、加密和解密方法现在都拒绝小于 1024 位的密钥,除非显式设置了 GODEBUG 环境变量 rsa1024min=0 来恢复旧行为。推荐的做法是仅在测试环境中这样做。
  • 预计算优化:crypto/rsa.PrivateKey.Precompute 方法变得更加安全高效,尤其是在部分填充 PrecomputedValues 的情况下,如 JSON 反序列化后的场景。

示例代码:随机数生成器示例

package mainimport ("crypto/rand""fmt"
)func main() {buffer := make([]byte, 16)_, err := rand.Read(buffer)if err != nil {panic(err)}fmt.Printf("Random bytes: %x\n", buffer)
}

测试框架扩展(Testing Framework Expansion)

  • 并发代码测试包:引入了实验性的 testing/synctest 包,提供了对并发代码测试的支持。它允许在一个隔离的“泡泡”环境中启动一组 goroutine,并使用假时间戳进行精确的时间控制。
  • 等待所有协程完成:synctest.Wait 函数能够等待泡泡内所有的 goroutine 阻塞,从而简化了复杂的并发逻辑测试。

示例代码:并发代码测试框架示例

package mainimport ("sync""time""testing/synctest"
)func TestConcurrent(t *testing.T) {bubble := synctest.Bubble()var wg sync.WaitGroupfor i := 0; i < 10; i++ {wg.Add(1)go func(id int) {defer wg.Done()// 在这里进行并发任务...time.Sleep(time.Second) // 模拟长时间运行的任务}(i)}bubble.Run(func() {wg.Wait()})// 使用 synctest.Wait 确保所有 goroutine 已经完成synctest.Wait()
}

其他重要变更(Other Significant Changes)

  • 弃用警告:crypto/cipher.NewCTR, crypto/cipher.NewOFB, crypto/cipher.NewCFBEncrypter, 和 crypto/cipher.NewCFBDecrypter 已被弃用,建议使用更安全的 AEAD 模式代替。
  • 哈希算法扩展:crypto/rsa.SignPKCS1v15 和 crypto/rsa.VerifyPKCS1v15 现在支持 SHA-512/224, SHA-512/256, 和 SHA-3 哈希算法。
  • 确定性签名:crypto/rsa.PrivateKey.Sign 现在根据 RFC 6979 生成确定性的签名,当 rand 参数为 nil 时生效。

示例代码:AEAD 模式加密示例

package mainimport ("crypto/aes""crypto/cipher""crypto/rand""fmt""io"
)func main() {key := make([]byte, 32) // AES-256 key sizeif _, err := io.ReadFull(rand.Reader, key); err != nil {panic(err)}block, err := aes.NewCipher(key)if err != nil {panic(err)}aead, err := cipher.NewGCM(block)if err != nil {panic(err)}nonce := make([]byte, aead.NonceSize())if _, err = io.ReadFull(rand.Reader, nonce); err != nil {panic(err)}plaintext := []byte("Hello, World!")ciphertext := aead.Seal(nil, nonce, plaintext, nil)fmt.Printf("Ciphertext: %x\n", ciphertext)decrypted, err := aead.Open(nil, nonce, ciphertext, nil)if err != nil {panic(err)}fmt.Printf("Decrypted: %s\n", decrypted)
}

更多细节补充

  • GOROOT 函数弃用:在新代码中推荐使用系统的路径来定位 go 二进制文件,并使用 go env GOROOT 来查找其 GOROOT。
  • 模块代理默认启用:为了提高构建过程的安全性和可靠性,默认启用了模块代理功能,确保从可信源获取依赖包。
  • JSON 输出格式:go build 和 go install 命令现在接受 -json 标志,用于报告构建输出和失败信息为结构化的 JSON 格式。
  • 上下文管理:测试函数 T.Context() 和基准测试函数 B.Context() 返回一个上下文,在测试完成后取消,但在清理函数运行前。
  • 目录切换:提供了 T.Chdir() 和 B.Chdir() 方法,可以在测试期间临时更改工作目录。
  • WebAssembly 支持:增加了 go:wasmexport 指令,允许 Go 函数导出至 WebAssembly 主机;支持使用 -buildmode=c-shared 构建 Go 程序为 WebAssembly 反应器/库;更多类型如 bool, string, uintptr 等可以作为 go:wasmimport 和 go:wasmexport 函数的参数或返回值类型;WebAssembly 支持文件已从 misc/wasm 移动到 lib/wasm。
  • ELF 文件符号版本支持:debug/elf 包新增了对动态 ELF 文件中符号版本的支持,包括获取定义的版本列表和需要的版本列表的方法。
  • 结构体字段标签选项:引入了 omitzero 字段标签选项,当字段值为零时会被省略,特别是在处理 time.Time 类型时特别有用。
  • 错误处理:UnmarshalTypeError.Field 包含嵌套结构体以提供更详细的错误消息。
  • 泛型类型别名:完全支持泛型类型别名,允许创建参数化的类型别名,就像定义类型一样;可以通过设置 GOEXPERIMENT=noaliastypeparams 来禁用此功能,但该设置将在 Go 1.25 中被移除。

结论

Go 1.24 版本通过一系列深度的技术改进和新特性,不仅增强了语言的功能性和灵活性,还大幅提升了程序的安全性和性能。无论是通过增强 HTTP/2 支持带来的网络通信能力,还是通过优化编码接口提高数据处理效率,亦或是通过引入新的测试框架加强并发代码的质量保障,Go 1.24 都为开发者提供了强有力的工具。希望本文提供的信息能够帮助读者更好地理解和应用这些变化,从而编写出更加高效且安全的 Go 程序。

参考资料

Go 1.24 Release Notes
Go Documentation

相关文章:

【Go】:深入解析 Go 1.24:新特性、改进与最佳实践

前言 Go 1.24 尚未发布。这些是正在进行中的发布说明。Go 1.24 预计将于 2025 年 2 月发布。本文将深入探讨 Go 1.24 中引入的各项更新&#xff0c;并通过具体示例展示这些变化如何影响日常开发工作&#xff0c;确保为读者提供详尽而有价值的参考。 新特性及改进综述 HTTP/2 …...

VUE3 一些常用的 npm 和 cnpm 命令,涵盖了修改源、清理缓存、修改 SSL 协议设置等内容。

以下是一些常用的 npm 和 cnpm 命令&#xff0c;涵盖了修改源、清理缓存、修改 SSL 协议设置等内容。 npm 常用命令 1. 修改 npm 源 更改为淘宝的 npm 镜像源&#xff08;可以提高安装速度&#xff09;&#xff1a; bash复制代码 npm config set registry https://registry…...

【SpringBoot】@Value 没有注入预期的值

问题复现 在装配对象成员属性时&#xff0c;我们常常会使用 Autowired 来装配。但是&#xff0c;有时候我们也使用 Value 进行装配。不过这两种注解使用风格不同&#xff0c;使用 Autowired 一般都不会设置属性值&#xff0c;而 Value 必须指定一个字符串值&#xff0c;因为其…...

【STM32-学习笔记-6-】DMA

文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…...

js实现一个可以自动重链的websocket客户端

class WebSocketClient {constructor(url, callback, options {}) {this.url url; // WebSocket 服务器地址this.options options; // 配置选项&#xff08;例如重试间隔、最大重试次数等&#xff09;this.retryInterval options.retryInterval || 1000; // 重试间隔&#…...

企业总部和分支通过GRE VPN互通

PC1可以ping通PC2 1、首先按照地址表配置ip地址 2、分别在AR1和AR3上配置nat 3、配置GRE a 创建tunnel接口&#xff0c;并选择tunnel协议为GRE&#xff0c;为隧道创建一个地址&#xff0c;用作互联 b 为隧道配置源地址或者源接口&#xff0c;这里选择源接口&#xff1b;再为…...

油猴支持阿里云自动登陆插件

遇到的以下问题&#xff0c;都已在脚本中解决&#xff1a; 获取到的元素赋值在页面显示&#xff0c;但是底层的value并没有改写&#xff0c;导致请求就是获取不到数据元素的加载时机不定&#xff0c;尤其是弱网情况下&#xff0c;只靠延迟还是有可能获取不到&#xff0c;且登陆…...

【2024年华为OD机试】(C卷,100分)- 字符串筛选排序 (Java JS PythonC/C++)

一、问题描述 题目描述 输入一个由N个大小写字母组成的字符串 按照ASCII码值从小到大进行排序 查找字符串中第K个最小ASCII码值的字母 (k > 1) 输出该字母所在字符串中的位置索引 (字符串的第一个位置索引为0) k如果大于字符串长度则输出最大ASCII码值的字母所在字符串…...

iOS - runtime总结

详细总结一下 Runtime 的核心内容&#xff1a; 1. 消息发送机制 // 消息发送的基本流程 id objc_msgSend(id self, SEL _cmd, ...) {// 1. 获取 isaClass cls object_getClass(self);// 2. 查找缓存IMP imp cache_getImp(cls, _cmd);if (imp) return imp(self, _cmd, ...);…...

第33 章 - ES 实战篇 - MySQL 与 Elasticsearch 的一致性问题

思维导图 0. 前言 MySQL 与 Elasticsearch 一致性问题是老生常谈了。网上有太多关于这方面的文章了&#xff0c;但是千篇一律&#xff0c;看了跟没看没有太大区别。 在生产中&#xff0c;我们往往会通过 DTS 工具将 binlog 导入到 Kafka&#xff0c;再通过 Kafka 消费 binlog&…...

Artec Leo 3D扫描仪与Ray助力野生水生动物法医鉴定【沪敖3D】

挑战&#xff1a;捕获大型水生哺乳动物&#xff08;如鲸鱼&#xff09;的数据&#xff0c;搭建全彩3D模型&#xff0c;用于水生野生动物的法医鉴定、研究和保护工作。 解决方案&#xff1a;Artec Eva、Artec Space Spider、Artec Leo、Artec Ray、Artec Studio、CT scans 效果&…...

PythonQT5打包exe线程使用

打包&#xff1a; pyinstaller --noconsole --onefile test.py–noconsole 表示不需要打开命令行 修改&#xff1a;test.spec 一般项目里面需要用的资源文件&#xff0c;比如lib、png、exe等。 需要单独修改spec文件 pathex[.],binaries[(D:/test.png, .),(D:/simsun.ttc, .…...

【Powershell】Windows大法powershell好(二)

PowerShell基础&#xff08;二&#xff09; 声明&#xff1a;该笔记为up主 泷羽的课程笔记&#xff0c;本节链接指路。 警告&#xff1a;本教程仅作学习用途&#xff0c;若有用于非法行为的&#xff0c;概不负责。 1. powershell 执行外部命令 powershell也可以执行一些外部的…...

前端学习-环境this对象以及回调函数(二十七)

目录 前言 目标 环境对象 作用 环境对象this是什么&#xff1f; 判断this指向的粗略规则是什么&#xff1f; 回调函数 目标 常见的使用场景 综合案例&#xff1a;Tab任务栏切换 总结 前言 男儿何不带吴钩&#xff0c;收取关山五十州 目标 能够分析判断函数运行在不…...

Element-plus、Element-ui之Tree 树形控件回显Bug问题。

需求&#xff1a;提交时&#xff0c;需要把选中状态和半选中状态 的数据id提交。如图所示&#xff1a; 数据回显时&#xff0c;会出现代码如下&#xff1a; <template><el-tree ref"treeRef" :data"tree" show-checkbox node-key"id" …...

互联网全景消息(10)之Kafka深度剖析(中)

一、深入应用 1.1 SpringBoot集成Kafka 引入对应的依赖。 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupI…...

Oracle Dataguard(主库为双节点集群)配置详解(5):将主库复制到备库并启动同步

Oracle Dataguard&#xff08;主库为双节点集群&#xff09;配置详解&#xff08;5&#xff09;&#xff1a;将主库复制到备库并启动同步 目录 Oracle Dataguard&#xff08;主库为双节点集群&#xff09;配置详解&#xff08;5&#xff09;&#xff1a;将主库复制到备库并启动…...

pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)

pytorch小记&#xff08;一&#xff09;&#xff1a;pytorch矩阵乘法&#xff1a;torch.matmul&#xff08;x, y&#xff09;/ x y 代码代码 1&#xff1a;torch.matmul(x, y)输入张量&#xff1a;计算逻辑&#xff1a;输出结果&#xff1a; 代码 2&#xff1a;y y.view(4,1)…...

PyTorch环境配置常见报错的解决办法

目标 小白在最基础的环境配置里一般都会出现许多问题。 这里把一些常见的问题分享出来。希望可以节省大家一些时间。 最终目标是可以在cmd虚拟环境里进入jupyter notebook&#xff0c;new的时候有对应的环境&#xff0c;并且可以跑通所有的import code。 第一步&#xff1a;…...

罗永浩再创业,这次盯上了 AI?

罗永浩&#xff0c;1972年7月9日生于中国延边朝鲜族自治州的一个军人家庭&#xff0c;是一名朝鲜族人&#xff1b;早年在新东方授课&#xff0c;2004年当选 “网络十大红人” &#xff1b;2006年8月1日&#xff0c;罗永浩创办牛博网&#xff1b;2008年5月&#xff0c;罗永浩注册…...

VUE3 provide 和 inject,跨越多层级组件传递数据

provide 和 inject 是 Vue 3 提供的 API&#xff0c;主要用于实现祖先组件与后代组件之间的依赖注入。它们可以让你在组件树中&#xff0c;跨越多层组件传递数据&#xff0c;而不需要通过 props 或事件的方式逐层传递。这个机制主要用于状态共享、插件系统或某些跨层级的功能。…...

git打补丁

1、应用场景 跨仓库升级 开发项目B使用的是开源项目A。开源项目A发现漏洞&#xff0c;作者进行了修复&#xff0c;我们可以通过使用git补丁的方式&#xff0c;将作者修改的内容复制到我 们的项目B中。 2、TortoiseGit方式 源仓库 格式化补丁 根据提交数量&#xff0c;生成…...

机械燃油车知识图谱、知识大纲、知识结构(持续更新...)

一、发动机 曲柄连杆机构 配气机构 点火系统 起动系统 燃油供给系统 润滑系统 冷却系统 二、底盘 &#xff08;一&#xff09;传动系统 1、离合器 2、变速器 3、万向传动装置 4、驱动桥 &#xff08;二&#xff09;行驶系统 1、车架 2、车桥 3、悬架 4、车轮 &a…...

Vue3学习总结

一、Vue 3 基础搭建与核心语法 1.创建 Vue 3 应用 在项目的入口文件 main.js 中&#xff0c;通过以下代码创建 Vue 3 应用实例&#xff1a; import { createApp } from vue; import App from ./App.vue;const app createApp(App); app.mount(#app); 这几行代码的作用是引入…...

Type-C双屏显示器方案

在数字化时代&#xff0c;高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步&#xff0c;一款结合了便携性和高效视觉输出的设备——双屏便携屏&#xff0c;逐渐崭露头角&#xff0c;成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…...

【读书与思考】焦虑与内耗

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 导言 今天一个朋友和我说&#xff0c;最近比较焦虑和内耗&#xff0c;无心工作和学习&#xff0c;我问他你焦虑内耗的时候&#xff0c;时间主要花在哪了&#xff0c;他告诉我说主要花在看有关移…...

基于python的网页表格数据下载--转excel

基于 Python 的网页表格数据爬取与下载:以维基百科为例 目录 基于 Python 的网页表格数据爬取与下载:以维基百科为例1. 背景介绍2. 工具与环境3. 操作步骤1. 获取网页内容2. 定位表格元素3. 表格变身 Pandas DataFrame4. 检查数据,收工!5. 进阶玩法与优化6. 完整代码4. 结果…...

Vue.js开发入门:从零开始搭建你的第一个项目

前言 嘿&#xff0c;小伙伴们&#xff01;今天咱们来聊聊 Vue.js&#xff0c;一个超火的前端框架。如果你是编程小白&#xff0c;别怕&#xff0c;跟着我一步步来&#xff0c;保证你能轻松上手&#xff0c;搭建起属于自己的第一个 Vue 项目。Vue.js 可能听起来有点高大上&#…...

LS1046+XILINX XDMA PCIE调通

欢迎点赞收藏&#xff0c;欢迎私下讨论技术&#xff0c;分享技术 硬件平台 &#xff1a;NXP LS1046 XILINX FPGA 软件平台&#xff1a;LINUX 4.19.68 buildroot LS1046 PEX3 接 XILINX FPGA&#xff0c;linux使用designware的PCI主控制器。下载XILINX DMA驱动&#xff0c;解…...

HarmonyOS:@LocalBuilder装饰器: 维持组件父子关系

一、前言 当开发者使用Builder做引用数据传递时&#xff0c;会考虑组件的父子关系&#xff0c;使用了bind(this)之后&#xff0c;组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题&#xff0c;引入LocalBuilder装饰器。…...

临朐网站建设建站首选哪家公司/企业网站制作公司

本文主要记录下在windows下进行python开发时用到了module: Crypto.Cipher Traceback (most recent call last):File ".\20190712-广域网透传压测.py", line 18, in <module>from Crypto.Cipher import AES ImportError: No module named Crypto.Cipher通过查询…...

今日招聘/上海快速优化排名

理解Java泛型最简单的方法是把它看成一种便捷语法&#xff0c;能节省你某些Java类型转换(casting)上的操作&#xff1a;List box ...;Apple apple box.get(0);上面的代码自身已表达的很清楚&#xff1a;box是一个装有Apple对象的List。get方法返回一个Apple对象实例&#xff…...

帮人做淘宝美工的网站/企业营销策划包括哪些内容

Lock关键字 C#提供lock关键字实现临界区&#xff0c;MSDN里给出的用法&#xff1a; Object thisLock new Object();lock (thisLock){ // Critical code section} 还有一种是比lock更“高级”的Monitor: private static object obj new object();public static void SomeMet…...

杭州网站公司设计/怎么开网站平台挣钱

从毕业到现在&#xff0c;已有2年了&#xff0c;自己学的软件专业而从事的是网络管理。现在在网络管理方面是很强了&#xff0c;但是自己爱好的专业方面一点也没有进步&#xff0c;为了以后的发展我决定从事软件测试和网络管理两方面同时下手&#xff0c;可能在学习这两方面的时…...

智恒企业网站管理系统/网站是怎么优化推广的

闪黑屏的原因主要是我们启动Activity的时候&#xff0c;需要跑完onCreate和onResume才会显示界面闪黑屏的原因主要是我们启动Activity的时候&#xff0c;需要跑完onCreate和onResume才会显示界面。也就是说需要处理一些数据后&#xff0c;才会显示。按照这种思路&#xff0c;是…...

贴吧网站怎么做/seo关键词排名优化app

作者&#xff1a;13 GitHub&#xff1a;https://github.com/ZHENFENG13 版权声明&#xff1a;本文为原创文章&#xff0c;未经允许不得转载。 Lombok简介 Lombok是Java语言的实用工具&#xff0c;确切的说&#xff0c;应该说是一个很好用的插件&#xff0c;对&#xff0c;插件&…...