Go语言进化之旅:从1.18到1.24的语法变革

Go 1.21的2个语言变化 Go 1.20已经于今年2月份发布,Go 1.21也不远了,我们来先堵为快,看看Go 1.21版本里几个有趣的变化。对于slice,调用clear函数,会保持原slice的长度不变,把里面元素的值修改为slice元素类型的零值。Go 1.21会新增一个clear函数,用于清理map和slice里的元素。对于map,调用clear函数,会直接把map里的元素清空,成为一个empty map。领取资料礼包,这份资料会不定期更新,加入我觉得有价值的资料。」,和同行一起交流学习,答疑解惑。文末附送2道面试题。 阅读详情
AI摘要

本文梳理了从2022年3月的Go 1.18到2024年2月的Go 1.24版本中,Go语言在语法层面的主要变化,包括泛型支持、循环与迭代进化、新增内置函数、unsafe包与内存操作等方面。同时给出迁移建议,并对Go语言未来改进方向进行展望。

Gone 是一个基于 Go 语言开发的轻量级依赖注入框架,专注于通过模块化设计和代码生成技术,帮助开发者构建可测试、易维护的应用程序架构。
推挤你使用,项目地址:https://github.com/gone-io/gone

Go语言自2009年首次发布以来,一直遵循着渐进式的演进策略,保持语言的简洁性和向后兼容性。从2022年3月发布的Go 1.18到2024年2月发布的Go 1.24,Go语言经历了一系列重要的语法更新,这些更新极大地增强了语言的表达能力和开发体验。本文将梳理这段时间内Go语言在语法层面的主要变化。

里程碑变革:泛型支持

Go 1.18:泛型的引入

Go 1.18是Go语言历史上具有里程碑意义的一个版本,因为它引入了期待已久的泛型(类型参数)支持:

// 泛型函数示例
func Min[T constraints.Ordered](x, y T) T {
    if x < y {
        return x
    }
    return y
}

// 泛型类型示例
type List[T any] struct {
    head, tail *element[T]
}

type element[T any] struct {
    next *element[T]
    val  T
}

泛型引入了几个新的语法元素:

  • 类型参数使用方括号表示:[T any]
  • 新的~运算符用于类型约束
  • 新的预声明标识符:any(interface{}的别名)和comparable
  • 增强的接口,可以嵌入任意类型并定义类型集

Go 1.19-1.21:泛型的完善

随后的版本对泛型进行了持续改进:

  • Go 1.19修正了方法声明中类型参数的作用域
  • Go 1.21大幅增强了类型推断能力:
    • 支持使用泛型函数作为参数调用泛型函数
    • 在值赋给接口时考虑方法
    • 改进了无类型常量参数的处理方式

Go 1.24:泛型类型别名全面支持

Go 1.24完全支持泛型类型别名,使得类型别名可以像定义类型一样被参数化:

// 泛型类型
type List[T any] struct {
    head, tail *element[T]
}

// 泛型类型别名
type MyList[T any] = List[T]

循环与迭代的进化

Go 1.22:循环变量作用域变化与整数遍历

Go 1.22引入了两个重要的循环相关更新:

  1. 循环变量的作用域变化:每次迭代创建新的循环变量,避免了闭包捕获问题
// Go 1.22之前:闭包可能捕获最后一次迭代的值
for i, v := range slice {
    go func() {
        fmt.Println(i, v) // 可能全部输出最后一组值
    }()
}

// Go 1.22:每次迭代都有新变量
for i, v := range slice {
    go func() {
        fmt.Println(i, v) // 正确捕获每次迭代的值
    }()
}
  1. For循环可直接遍历整数:
// 从0遍历到9
for i := range 10 {
  fmt.Println(i)
}

Go 1.23:迭代器函数的支持

Go 1.23(原计划于2024年8月发布)引入了实验性的"range-over-func"功能,允许for循环使用函数作为迭代器:

// 使用迭代器函数
for v := range myIterator {
    // 使用v
}

// 带索引的迭代器
for i, v := range myKeyValueIterator {
    // 使用i和v
}

标准库中的iter包和相关支持为处理迭代器提供了基础设施。

Go 1.24:迭代器支持增强

Go 1.24为迭代器提供了进一步支持,特别是在strings和bytes包中:

// 按行迭代字符串
for line := range strings.Lines("line1\nline2\nline3") {
    // 处理每一行
}

// 按分隔符分割并迭代
for token := range strings.SplitSeq("a,b,c", ",") {
    // 处理每个标记
}

新增内置函数

Go 1.21:min、max和clear

Go 1.21引入了三个实用的内置函数:

// 计算最小值和最大值
min := min(1, 2, 3)  // 返回1
max := max(1, 2, 3)  // 返回3

// 清空map或将切片元素置零
m := map[string]int{"a": 1, "b": 2}
clear(m)  // 现在m是空的

s := []int{1, 2, 3}
clear(s)  // 现在s是[0, 0, 0]

unsafe包与内存操作

Go 1.20:unsafe包新增函数

Go 1.20在unsafe包中新增了三个函数:SliceData、String和StringData,与Go 1.17的Slice函数一起,为构造和解构切片、字符串值提供了完整的工具集。

其他语法增强

Go 1.20:切片到数组的直接转换

Go 1.20允许直接从切片到数组的转换:

slice := []byte{1, 2, 3, 4}

// 旧方式
array := *(*[4]byte)(slice)

// Go 1.20新方式
array := [4]byte(slice)

Go 1.21:Nil Panic行为变更

在Go 1.21中,用nil调用panic会导致运行时panic,类型为*runtime.PanicNilError:

panic(nil)  // 现在会抛出*runtime.PanicNilError

Go 1.24:模块工具指令

Go 1.24引入了go.mod中的tool指令,用于跟踪可执行依赖项:

// go.mod中的工具指令示例
tool example.com/tools/stringer

这消除了之前在"tools.go"文件中添加空白导入的变通需求。

Go 1.24:WebAssembly导出功能

Go 1.24新增了go:wasmexport编译器指令,用于将Go函数导出到WebAssembly宿主环境:

//go:wasmexport hello
func hello() {
    // 此函数将被导出到WebAssembly宿主环境
}

版本变更时间线

以下是Go 1.18到Go 1.24各版本实际发布时间及主要语法变化概览:

版本发布时间主要语法变化
Go 1.182022/03引入泛型、模糊测试、工作区模式
Go 1.192022/08类型参数作用域修正、新的原子类型
Go 1.202023/02切片到数组的直接转换、unsafe新函数
Go 1.212023/08min/max/clear内置函数、包初始化顺序定义、类型推断增强
Go 1.222024/02循环变量每次迭代新建、range整数支持
Go 1.232024/08迭代器函数支持、新的unique和iter包
Go 1.242025/02泛型类型别名全面支持、工具指令、迭代器增强

迁移建议

随着Go语言的不断演进,开发者应当注意以下迁移建议:

  1. 升级前阅读文档:每个Go版本都有详细的发布说明,尤其需要注意"不兼容性说明"部分。
  2. 使用Go版本控制:在go.mod文件中明确指定所需的Go版本,确保项目在不同环境中的一致性。
  3. 关注GODEBUG环境变量:某些行为变更可以通过GODEBUG变量控制,在迁移期间非常有用。
  4. 逐步采用新特性:对于大型代码库,可以逐步采用新语法特性,尤其是对于泛型等重大变化。
  5. 工具升级:确保使用的开发工具和linter支持新版本的Go语法。

总结与展望

从Go 1.18到Go 1.24,Go语言在保持简洁性和向后兼容性的同时,引入了许多增强开发体验的语法特性。泛型的引入是这一时期最重大的变革,而循环变量作用域的改进和迭代器支持则解决了长期以来的痛点。

展望未来,Go语言可能会继续在以下方面进行改进:

  • 进一步完善泛型特性
  • 增强错误处理机制
  • 改进并发编程模型
  • 增加更多语法糖以提高开发效率

Go语言的进化紧密围绕其设计哲学:保持简洁、实用性和可读性,同时谨慎地增加能够显著提升开发体验的特性。这种平衡的设计理念,使Go语言在企业级应用开发中越来越受欢迎。

作为Go开发者,持续关注语言的变化,并适时采用新特性,将有助于编写更清晰、更高效的代码。


参考资料:

golang简史 Go语言简介 阅读详情

相关推荐

Golang 1.18新特性泛型

泛型的英文是Generics,就是函数的参数,或者容器元素的类型,支持更广泛的类型,不再是特定的类型。使用泛型必须要求golang版本1.18以上,通过下面命令查看 实例 我们先看下面的两个函数的功能,通过一个map,用来计算整型和浮点型的累计。 使用泛型函数来支持更多类型。 调用时,也可以忽略类型参数,可以自动类型推断 声明类型约束 Constraint(约束) 约束的意思是限定范围, constraint的作用就是限定范围, 将T限定在某种范围内而常用的范围有: 自定义约束 泛型切片 运行结果

geek99_guo的博客 316

Go1.18,1.19 泛型从入门到放弃+Go1.21

/ Printf() 可输出变量value的类型(底层就是通过反射实现的)// 通过反射可以动态获得变量value的类型从而分情况处理// ...为了避免使用反射而选择了泛型,结果到头来又为了一些功能在在泛型中使用反射,是不是真的需要用泛型?在Go1.18之前,Go官方对 接口(interface) 的定义是:接口是一个方法集(method set)Go1.18开始就是依据这一点将接口的定义正式更改为了 类型集(Type set)

General_zy的博客 4666

HDRP shader 获取阴影(Custom Pass)

Unity:2021.3.0f1 HDRP:12.1.6

LanQ的博客 2099

[持续更新ING]Go语言历史版本演进和新特性

Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。

mdpets的博客 6810

【现代信号处理】01 -概率论与随机过程回顾

概率论与随机过程回顾 文章目录概率论与随机过程回顾1. 统计模型的相关概念1.1 统计实验(不确定性)1.2 样本点1.3 样本空间Ω1.4 概率1.5.统计模型是先验的2. 概率和统计的差异2.1 联系2.2 差异2.3.1 概率和统计问题的三要素2.3.1.1 model-模型2.3.1.2 data-数据2.3.1.3 decision-决策2.3.2 关系图3. 样本空间的重要性3.1 贝朗特悖论3.1.1 解法一3.1.2 解法二3.1.3 解法三3.2 结论4.概率相关的概念4.1 随机变量4.

qq_41741344的博客 1406

T-Box功能详解及应用

T - BOX,其全称为 Telematics Box,作为远程 / 车载通信模块,是一款集车身网络与无线通讯功能于一体的智能终端设备。它充当了多媒体车机与 TSP(汽车远程服务提供商)以及互联网之间的无线路由器角色,为用户创造了远程访问的可能。用户借助T - BOX能够对车辆配备的各个 ECU(电子控制单元)进行远程操控,包括远程启动或停止发动机开启或关闭空调天窗后备箱门车门,以及实现闪灯鸣笛等功能。

wgl110110的博客 5642

51c大模型~合集111

OpenAI 的某发言人表示:「为了提高清晰度和安全性,我们增加了一个额外的后处理步骤,其中模型会审查原始的思维链,删除任何不安全的内容,然后简化某些复杂的思维。可以看到,虽然 ChatGPT 确实完成了任务并展示了总结版的思维链,但似乎并未如 OpenAI 发言人说的那样给出与提示词语言同样语言的总结版。北大-灵初联合实验室表示,Align-DS-V的多模态强推理能力是VLA模型大脑端的核心,接下来的研究训练计划,是利用多模态推理模型的跨模态穿透能力,实现action穿透,最终实现真正高效的VLA模型。

whaosoft~aiotの开发板商城 2318

海康威视GigE工业相机的python调用demo

默认路径安装完成后,在路径C:\Program Files (x86)\MVS\Development\Samples\Python\BasicDemo下的BasicDemo.py中,海康威视官方提供了基本的调用方法,本文也是基于这个修改的。BasicDemo.py提供了通过枚举选择相机的方法,在官方的另一个DEMO:ConnectSpecCamera.py中提供了另一种不通过枚举,直接访问特定IP相机的方法,也可以参考。另外,如果每台相机都定义了唯一的用户定义名,也可以通过用户定义名来区分相机。

xulibo5828的博客 2109

【Go 基础篇】Go 语言介绍

Go语言,也称为Golang,是一门由Google开发的开源编程语言。它的设计目标是提供一种高效、简洁、安全且支持并发的编程语言,适用于构建可靠且高性能的软件系统。Go语言在短短的时间内迅速走红,成为开发者们喜爱的选择,因为它具备独特的优势和特点,能够解决传统编程语言中的一些问题。

繁依Fanyi的博客 1699

版电力系统故障录波_故障录波识图与典型故障波形分析

1、设置故障录波的目的故障录波装置是对电力系统运行状况进行监控的一种自动化设备。系统正常运行时,录波装置不启动录波,当系统发生故障时,通过启动录波装置迅速启动录波器录波,直接记录反应故障装置安装处系统故障的电气量。2、故障录波的作用(1)正确评价继电保护和自动装置的工作。(2)正确分析事故的原因并研究防止对侧。(3)发现继电保护和自动装置缺陷。(4)发现一次设备缺陷,及时消除隐患。(5)帮助寻找故...

weixin_42495661的博客 1万+

[SoC]SoC验证中bootcode与firmware相关验证经验总结

本文总结了SoC验证中bootcode和firmware的验证经验。重点介绍了两种数据加载方法:1)使用Verilog系统函数$readmemh/$readmemb直接写入ROM/ARAM,需注意文件路径、格式和斜杠方向;2)通过Memory Hierarchy在initial块中操作,需要添加适当延时并注意路径拼接。文章还提供了在testcase phase中先读取数据到HASH再写入SRAM的示例,并强调加载后需使能edc_bypass以避免ECC错误。验证过程中需特别注意文件位置、格式要求及路径处理等

元直的博客 2498

Go 1.18 版本新特性详解!

导语|本文推选自腾讯云开发者社区-【技思广益 · 腾讯技术人原创集】专栏。该专栏是腾讯云开发者社区为腾讯技术人与广泛开发者打造的分享交流窗口。栏目邀约腾讯技术人分享原创的技术积淀,与广泛开发者互启迪共成长。本文作者是腾讯后台开发工程师Johns。本文主要探析Go 1.18版本新特性,希望本文能对此方面感兴趣的开发者们提供一些经验和帮助。Go官方在今年315悄悄发布了Golang 1.18版本。...

QcloudCommunity的博客 2536

服务器搭建原神私服教程

项目的稳定版分支提供了编译好的服务端程序,但是博主觉得还是用dev版本的比较好。dev版本需要自己编译的,不要听到编译这两个字就头大,相反,这个服务端的编译相当简单。把文件中的两个IP地址127.0.0.1修改为你服务器的地址,修改完成后按 esc 输入 :wq。Mongodb作为服务端的数据库使用,我们这里安装最新版的Mongodb5。注意:如果想要使用最新版的服务端,必须安装>=17版本的java。tmux可以保证你关掉控制台的时候,程序依然继续运行。至此,服务端所需要的运行环境全部配置完成。

用最简单的方式说最重要的事!服务器、存储、云计 算、A智能的大数据产品、游戏开发技术。致力于广 大开发者、政企用户、各项机构等,构建云上世界提供全方位云计算解决方案。旨在打造差异化的开放式闭环生态系统帮助用户快速构建稳定、安全的云计算环境。 1万+

Golang1.21更新内容全面介绍~

在Golang1.21这一次更新中,主要更新内容为:for range的一个语义变更 、新加入max、min、clear方法、contenxt增添api、WASI的支持本文主要带大家熟悉这些变更的内容~

qq_51898139的博客 2112

材料仿真软件:LAMMPS_(8).温度和压力控制

在 LAMMPS 中,温度和压力的控制是通过多种恒温器和恒压器实现的。Nose-Hoover 恒温器和恒压器因其准确性和广泛适用性而被经常使用,而 Berendsen 恒温器和恒压器则因其计算效率高而适用于初步仿真或粗粒化模型。温度重标和压力重标方法虽然简单,但在某些情况下可以快速调整系统的温度和压力。通过选择合适的控制方法,可以根据具体的需求和系统特性来设计和运行分子动力学仿真,从而获得准确和可靠的结果。在实际应用中,建议先进行初步的仿真以确定合适的控制参数,然后再进行细致的仿真以验证结果的稳定性。

kkchenjj的博客 1693

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Golang1.18新特性

golang1.18新特性

走在架构师的路上 1964

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Go 1.25新特性前瞻:GC提速,容器更“懂”Go,json有v2了!

并且,和之前的版本一样,Go 1.25 带来的许多改进,都如同“无形之手”,你可能无需修改一行代码,甚至无需刻意感知,只需简单升级,便能享受到性能的飞跃、诊断能力的提升以及潜藏错误的暴露。我鼓励所有 Go 开发者,积极尝试 Go 1.25 RC1 版本,将其应用到你的开发、测试环境中,并向 Go 团队提供宝贵的反馈。这门进阶课程,是我多年 Go 实战经验和深度思考的结晶,旨在帮助你突破瓶颈,从“会用 Go”迈向“精通 Go”,真正驾驭 Go 语言,编写出更优雅、更高效、更可靠的生产级代码!

TonyBai 2353

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Go 1.23 版本发布啦,这些重大更新你一定要知道!

在Go 1.22版本发布6个月之后,Go 1.23于北京时间2024年8月14日凌晨1:03正式发布。此次更新的主要变化集中在工具链、运行时和库的实现上。让我们一起来看看Go 1.23带来了哪些新变化吧!准备好了吗?准备一杯你最喜欢的咖啡或茶,随着本文一探究竟吧。

cmy_top的博客 1662

go 语言初识

简介Go语言的发展历史:Go语言早期版本发布。:Go 1版本发布,标志着语言稳定性的提升。:Go 1.5版本发布,移除了最后的C代码,实现了自举(即使用Go语言本身来编译Go语言)。:Go 1.14版本发布,此时Go Module已经成为官方推荐的包管理工具。特点:Go是静态类型语言,这意味着所有变量的类型在编译时都需要明确,不同类型之间不允许直接运算。:与解析型语言不同,Go语言的源代码在执行前需要先编译成机器码,然后由机器直接执行。

weixin_48183870的博客 801

Go语言1.18发布了

go语言1.18发布了

软件行业技术文化交流。 885

Go 1.18新特性——泛型

泛型是一种编程范式,它将类型参数化,可以用于编写灵活且可重用的函数或数据结构,这样我们就可以用自己的类型来代替那些被硬编码的类型。泛型的好处是可以在编译时期发现类型不匹配的错误,而不是在运行时期。

m0_54644067的博客 2661

golang各版本迭代新特性总览

golang各大版本迭代功能概览;

zhang_yasong的博客 qq_465790184 6866

2024年最全【Go语言入门教程】Go语言简介(1),2024年最新【干货】

Go语言的编译过程其实是非常有趣并且值得学习的,通过对Go语言四个编译阶段的分析和对编译器主函数的梳理,我们能够对 Golang 的实现有一些基本的理解,掌握编译的过程之后,Go语言对于我们来讲也不再那么神秘,所以学习其编译原理的过程还是非常有必要的。

2401_84920052的博客 1769

Golang——Go语言发展史(一)

一、前言 个人认为:作为一名语言爱好者,需要了解到一门语言的发展史(当然这个在面试的时候属于拓展话题,会让面试官眼前一亮)。如果单纯停留在使用者的角度, 二、

九天揽月 5519

Go 语言安装部署(超详细版本)

在学习和使用 Go 语言时,正确的安装和配置是非常重要的一步。本文将介绍如何在不同操作系统上安装 Go 语言,并讨论一些常见的配置选项,帮助读者更好地了解和使用 Go 语言。无论是初学者还是有一定经验的开发者,都能从本文中获得有用的信息和指导,使他们能够顺利地开始使用 Go 语言进行开发。

栗筝i的博客 7356

Go语言的发展历史

Go语言的发展历史

石头的博客 927
上一篇: Gone v2 如何解决Goner间的循环依赖问题
下一篇: Gone v2 Tracer 组件-给微服务提供统一的traceID
dapeng-大鹏
博客等级 码龄16年 1349粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dapeng-大鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值