2020年/04月/18日

首页回退

Go1 Go2

原文

Go语言诞生在21世纪新一波工业编程语言即将爆发的时期。在2010年前后诞生了编译型语言Rust、Kotlin和Switft语言,前端诞生了Dart、TypeScript等工业型语言,最新出现的V语言更甚至尝试站在Go和Rust语言肩膀之上创新
Go从2007年开始设计,在2009年正式对外公布,至今刚好十年。十年来Go语言以稳定著称,Go1.0的代码在2019年依然可以不用修改直接被编译运行。但是在保持语言稳定的同时,Go语言也在逐步夯实基础,十年来一直向着完美的极限逼近

主要三个语法变化

第一个重大的语法变化是在2012年发布的Go1.2中,给切片语法增加了容量的控制,这样可以避免不同的切片不小心越界访问有着相同底层数组的其它切片的内存。

第二个重大的变化是2016年发布的Go1.7标准库引入了context包。context包是Go语言官方对Go进行并发编程的实践成果,用来简化对于处理单个请求的多个Goroutine之间与请求域的数据、超时和退出等操作。

第三个重大的语法变化是2017年发布的Go1.9 ,引入了类型别名的特性:type T1 = T2。其中类型别名T1是通过=符号从T2定义,这里的T1和T2是完全相同的类型
一些语法细节的变化,比如Go1.4对for循环语法进行了增强、Go1.8放开对有着相同内存布局的结构体强制转型限制
从Go1.4开始,Go语言的运行时采用Go语言实现
第一次GC性能变革发生在Go1.5时期,这个时候Go语言的运行时和工具链已经全部从C语言改用Go语言实现,为GC代码的重构和优化提供了便利。Go1.5首次改用并行和增量的方式回收内存,这将GC挺短时间缩短到几百毫秒
最终在2018年,由rsc亲自操刀从头发明了基于最小化版本依赖算法的版本管理特性。模块化特性从Go1.11开始引入,将在Go1.13版本正式转正,以后GOAPATH将彻底退出历史舞台。
在Go1.13中,除了模块化特性转正之外,还有诸多语法的改进:比如十六进制的浮点数、大的数字可以通过下划线进行分隔、二进制和八进制的面值常量等。但是Go1.13还有一个重大的改进发生在errors标准库中
Go2最期待的特性是泛型。从开始Go语言官方明显抵制泛型,到2018年开始公开讨论泛型,让泛型的爱好者看到了希望。
最后一个值得关注的是Go语言对WebAssembly平台的支持。根据Ending定律:一切可编译为WebAssembly的,终将会被编译为WebAssembly

候杰老师曾经说过:勿在浮沙筑高台。而中国互联网公司的繁荣更多是在业务层面,底层的基石软件几乎没有一个是中国所创造。作为一个严肃的软件开发人员,我们需要向Go语言学习,继续扎实掌握底层的理论基础,不能只聚焦于业务层面,否则下次中美贸易战的时候依然要被西方卡脖子。

经过这么多年发展,中国的软件行业已经非常繁荣和成熟,同时很多软件开发人员也开始进入35岁的中年门槛。其实35岁正是软件开发人员第二次职业生涯的开始,是开始形成自我创造力的时候。但是某些资本家短视的996或007等急功近利的福报观点正导致中国软件人员过早进入未创新而衰的阶段。中国的软件工程师不应该是码农、更不是码畜牧,我们虽然不会喊口号但是始终在默默前行。

目前中国已经有大量的软件开发人员有能力参与基础软件的设计和开发,正因为这一波脚踏实地程序开发人员的努力,我相信在下个十年我们可以Go得更远。