谷歌日前将自家的Go语言升级到了1.3正式版,新版本主要是更新了更精确的垃圾回收机制,解决了GC回收的问题。不过新版本开始也不再支持Windows2000,支持了Native Client虚拟机架构。
Google开放Go的代码,希望籍此帮助Go语言的发展。首席软件工程师Rob Pike说:我们开发Go,是因为近10年左右开发程序之难让我们有点沮丧。Google两年前开始开发Go,1年前开始有一只团队专职于此。Go的定位是系统编程,比如Web服务器、存储系统和数据库等,但也欢迎在其它方面的应用。"
1.引入轻量级线程——协程(coroutine),Go语言中叫goroutine。
2.采用Erlang风格的并发模型,即消息是进程间唯一的通信方式(而非共享内存)。两个goroutine之间通信通过channel(通道)进行。
3.对代码风格进行了强制统一,比如public变量必须以大写字母开头,private变量必须以小写字母开头,从而省略了这两个关键字。{}中{的书写不能另起一行等。
4.defer关键字,不管程序是否异常,均在退出时执行的代码。避免了大量try、catch语句。
5.函数允许返回多个值,且最后一个值问error类型,用于在错误的情况下返回详细信息。
6.反对(不提供)函数和操作符的重载,不提供继承、虚函数、虚函数重载。但是提供组合,也达到继承的目的。
7.没有构造函数和析构函数 ,提供接口,与其他语言最大的区别在于接口是非侵入性的。即实现类无需从接口派生
8.支持匿名函数与闭包。
Go是为了帮助人们阅读、调试和维护大型软件系统而生的,所以目标是
不再缓慢
不再笨拙
提高效率
保持(甚至提升)扩展性
但是在使用C++或者Java开发中却常常遇到各种问题:
构建缓慢
依赖性难以控制
每个编程语言都使用不同的语言子集
程序难以理解(文档等原因)
重复工作
更新成本高
版本交叉
自动化不方便(工具问题)
跨语言构建
而Go语言则是为了解决这些问题而设计的。
另外,C语言的依赖一直是个大问题,包括依赖叠加、编译时引入依赖的情况都很难处理,同时你也没办法查清哪些依赖是可以删除的,那些不可以。在C++中,这一点变得更加明显:
每个类里都有#include文件
#include文件中有代码(而不仅仅是声明)
#ifndef的残留
所以一直无法在一台机器上构建大型Google二进制。(To build a large Google binary on a single computer is impractical.)
当然,工具确实很有帮助,于是做了如下改进:
新的分布式构建系统
不再需要Makefile(但仍然使用BUILD文件)
多缓存
多复杂度(大程序本身所具有的)
即使在Google的分布式构建系统的的帮助下,大型构建工程依然会花费不少时间(以其中一个二进制文件为例,在2007年花了45分钟,现在是27分钟)。生活质量还是太低。
今天Go 团队很高兴地宣布Go 1.8发布了。现已提供下载。整个标准库有了显著的性能提升和变化。该版本主要的更新内容如下:
Go 1.7中为64位x86引入的编译器后端现在用于所有体系结构,这些体系结构将会有显著的性能改进。例如,我们的基准程序所需的CPU时间在32位ARM系统上减少了20-30%。在此版本中,64位x86系统还有一些性能改进,编译器和链接器更快了,编译时间应该比Go 1.7提高约15%。但是在这一领域还有很长的路要走:我们希望在未来版本中实现更快的编译速度。
垃圾收集暂停时间明显更短,通常在100微秒以下,有时候甚至低至10微秒。
HTTP服务器添加对 HTTP/2 Push的支持,允许服务器抢先发送响应到客户端。这对于通过消除往返行程来最小化网络延迟非常有用。HTTP服务器现在还支持正常关机了,允许服务器通过在服务所有正在运行的请求之后关闭,而最小化停机时间。
上下文(添加到Go 1.7中的标准库)提供了取消和超时机制。Go 1.8在标准库中添加了更多对上下文的支持,包括数据库/ sql和net包以及net / http包中的Server.Shutdown。
现在使用新添加的Slice函数在排序包中对切片进行排序更简单。例如,要通过“名称”字段对结构体片段进行排序: