50 【Go版本变化】
Go的版本介绍:https://golang.org/project/
https://golang.org/doc/go1.4
#Go1.4#
语言层面变化较少,但是编译器而言是有巨大的突破的,体现在指针间的转换。
这个release核心聚焦在实现工作上,重点是garbage collector(垃圾回收)和并行处理的垃圾回收器,这些改动也会在之后的几个版本中不断优化。
并且,栈区是连续的,需要内存时能真实分配地址,而不是通过link方式链接到其它区。这个版本也减轻了“hot stack split”的问题。
Go1.4也保证了兼容性,绝大部分代码可以直接运行在上面,而不需要改动。
===改变:range===
for i, v := range x {
...
}
for i := range x {
...
}
Go1.3支持以上两种range格式
Go1.4增加了一种range遍历:
for range x {
...
}
===改变: Methods calls on **T===
type T int
func (T) M() {}
var x **T
both gc and gccgo accepted the method call
x.M()
这里x是二维指针,需要两次解引用。这种调用方式在Go1.4不再被允许
===change: 支持的平台===
Android, NaCi on ARM, Plan9 on AMD64
===change: 兼容性指导===
unsafe的类型转换不保证兼容性
===change: runtime的改进===
在Go1.4之前的版本,runtime(garbage collector, concurrency support, interface management, maps, slices, strings, ..)大部分是用c语言完成的,和少量的汇编语句。
Go1.4做出了改变,runtime已经完全换成Go语言了。这意味着Go能很精确的知道分配的空间和变量。
...
===Assembly===
===gccgo===
==改变: internal packages===
可能有些包仅放在包内,而不希望被外部所访问。之前的Go是不支持的,Go1.4为了让这种需求变得可能,定义了internal packages机制。
/a/b/c/internal/d/e/f,这里的internal包仅允许/a/b/c所访问,而不能被/a/b/g所调用。
===source layout调整===
去除了src/pkg这一层,从src/pkg/fmt调整为src/fmt
===SWIG===
Go1.4需要SWIG3.0.3版本
===性能===
大部分程序,1.4和1.3的性能相差相近,甚至有时候Go1.4会更慢。
GC肯定是更快了
=====标准库=====
A,没有新的packages
B,Major packages
. bufio.Scanner
. syscall
C. Minor packages
不再一一列出,参考:https://golang.org/doc/go1.4
==========Go1.5=========
Big:
. complier全部用C重写,C编译器不再需要了
. GC垃圾回收器现在是并行处理的(concurrent)
. 默认状态,GOMAXPROCS变量和可用core数一致,之前的版本默认是1;
. internal packages机制全部支持,不是仅限于core package
. go提供了实验性质的支持,对于vendor目录
. go tool trace命令可一直追踪调试
. go doc可以custom,之前仅支持默认格式,不可修改
===Language change===
m := map[Point]string{
Point{29.935523, 52.891566}: "Persepolis",
Point{-25.352594, 131.034361}: "Uluru",
Point{37.422455, -122.084306}: "Googleplex",
}
m := map[Point]string{
{29.935523, 52.891566}: "Persepolis",
{-25.352594, 131.034361}: "Uluru",
{37.422455, -122.084306}: "Googleplex",
}
Go1.5可以支持Point不再显式写出来
===Implement===
==No more C==
编译器和汇编器不再依赖C,是全部用Go重写了。
仅仅C source是由cgo来处理的。这里在Go1.4是由c编译器处理的。Go1.5版本,即使C source tree,编译的时候用的也是Go编写的编译器。
==编译器和tools==
编译器重写后,编译时会生成一些中间obj,之前的版本这些obj的后缀是.8g, .6g。Go1.5开始,这些object的后缀全部修改成.o
==GC垃圾回收器==
Go1.5 重新设计了GC的部分。GC的调度更优,期待GC延迟比之前要更好.
==Runtime & Build & Ports==
===Tools===
==Translating==
==Renaming==
==Moving==
==Compiler==
==Assembler==
==Linker==
==Go commands==
==Go vet command==
==Trace command==
==Go doc==
==Cgo==
===性能===
没办法准确地衡量,有的会更快,有的会更慢。很多剩余工作需要完成,这些会放在Go1.6之后的版本完成。
===Core library===
. Flag
. Floats in math/big
. Go types
. Net
. Reflect
. Hardening
===Minor changes===
不再一一列出,参考:https://golang.org/doc/go1.5
=====Go1.6====
===语言变化===
没有
===Ports===
===Tools===
==Cgo==
Cgo编译器之前用go重写了,这次又再次进行了优化。
主要变化:go和c可以共享Go分配的内存了
==Compiler工具链==
==Gccgo===
==Go command==
Go1.5开始对vendor进行实验性的支持,Go1.6不再只是实验性质,而是默认支持了。
==Go doc==
==Go vet==
===性能===
相比较Go1.5,有的更快,有的更慢了
===Core lib===
==Http2==
支持了Http2协议,client和server在使用HTTPS时能恰当地处理HTTP2请求
==Runtime==
runtime提供了maps轻量级的冲突检测机制。
程序结束时的panic,tuntime默认打印当前running的goroutine栈信息。而不是所有的goroutines,能显著地快速定位到问题原因。
==Reflect==
==Sorting==
排序减少了10%的calls
==Templates==
{{block}}可以支持明明的子模板,能增加复用性
==Minor changes==
不再一一列出,参考:https://golang.org/doc/go1.6
===============Go1.7=====================
Go1.7增加了一些平台的支持。更新了X86-64编译器的后端模块。
也包含了以下包的修改:context包,x/net。testing包提供了对层次结构的testing的支持,以及benchmark的支持。
该版本彻底完成了对vendor的支持
====Language change====
==Ports==
====Tools====
==Assembler,Compiler Toolchain==
==Cgo==
Cgo的包现在可能可以支持Fortran源码(包括C,c++, Objective-C, SWIG),尽管Go绑定必须使用C语言API
Go绑定当前可能可以使用新的helper函数(C.CBytes)。
C.CString能把GO的string转换成*C.byte(C语言的char*)
C.CBytes能把GO的[]byte转换成unsafe.Pointer(C语言的void*)
==Gccgo==
==Go command==
==Go doc==
==Go vet==
==Go tool dist==
go tool dist list能将GO目前支持的所有的OS和平台都列出来
==Go tool trace==
go tool trace已经在之前的版本中支持
1 收集traces信息比之前的版本都更有效。收集trace的消耗时间是25%,之前的版本是400%。
2 trace file支持file和line number.
3 trace工具会break up大的trace以避免感染到正在请求的用户
==性能==
当前版本,在我们的基础性能测试中,code generation changes alone typically reduce program CPU time by 5-35%
感觉不是二进制运行时间有调整,是代码编译时间有降低
很多包有做优化,包括crypto/sha1, crypto/sha256等包
垃圾回收的pause也比Go1.6更短
==Core library==
=Context=
Go1.7把golang.org/x/net/context移动到标准库context包。这就允许取消context,context超时,传递request-scoped数据,包括net包,net/http,os/exec等包
更多信息参考release note
==http tracing==
go1.7引入了net/http/httptrace,这个包提供了对HTTP request的tracing event的支持
==Testing==
testing支持了subtest和subbenchmark的支持,使得层次化testing更方便
==Runtime==
runtime有多处改变,详情请看release note,不再一一列出
==Minor change==
bufio...,不再一一列出,详情请看release note
net/http中有较多修改
=====GO1.8=====
更新了compiler后端(生成更有效的代码)
减少了gc的pause时间(消除了stop-the-world的rescan)
增加了HTTP/2 push支持
增加了http的gracefull shutdown
增加了更多的context支持
启用了profiling mutexes
简化了sort slice
==语言变化==
func example() {
type T1 struct {
X int `json:"foo"`
}
type T2 struct {
X int `json:"bar"`
}
var v1 T1
var v2 T2
v1 = T1(v2) // now legal
}
之前的转换忽略了tag信息,现在加上了tag的转换
====ports====
增加了更多的平台的移植
====Tools====
==Assembler==
==Yacc==
yacc工具被移除。Go1.7中,yacc工具不再被go编译器使用。它被放在golang.org/x/tools/cms/goyacc工具包中
==Fix==
==Pprof==
pprof工具可以检测TLS server并且可以忽略证书验证,使用https+insecure模式
==Trace==
trace工具支持了--pprof选项
==Vet==
==compiler toolchain==
==Cgo, Gccgo, Default GOPATH, Go get, Go doc, Plugins==
====Runtime====
Argument liveness:参数的存活时间,Go1.7支持一个变量长时间存活
Concurrent maps:并发情况下的maps下的乱用,增加了race detector,竞争检测
Memstats:增加了运行时的内存监控,runtime.Memstats
====性能====
对性能影响比较难以估量,有一点点优化,包括bytes, crypto/aes等package
==GC==
gc的pause时间要比go1.7更少,通常是100毫秒,而且大部分是在10毫秒以内。有篇文章专门描述了此次优化 https://github.com/golang/proposal/blob/master/design/17503-eliminate-rescan.md
==Defer==
defer的开销降低一半
==cgo==
go转c的开销降低一半
====标准库====
==Sort==
sort包支持了less函数,意味着它更加通用,不用再重复编写sort相关的代码
==Http2/push==
net/http包支持了发送HTTP/2的server push
类似于Flusher/hijacker接口,http2的ResponseWriter实现了新的Pusher接口
==Http server graceful shutdown==
http服务器能支持graceful shudown,使用Server.shutdown方法
==More context support==
==Mutex contention profiling==
支持对包含内容的mutext进行profile
=====Minor changes===
细小改变很多,不再一一列出,详情请看release note
其中改动较多的有net/http, net/url, os, time等包
======GO1.9=====
====语言上的变动====
1,支持类型重命名: type T1 = T2
2,x*y + z,float64(x*y)+z这两种形式不同,具体为啥不同,没看懂
===Ports移植平台====
====Tools====
并行编译
vendor: 用./...不再匹配vendor的包,新的格式: ./vendor/...
GOROOT
Compiler toolchain
Aessmbler
Doc
Env
Test
Pprof
Vet
====runtime===
支持打印栈内帧
runtime.CallersFrames在Go1.7就支持了
====性能====
大部分程序会更快那么一点点,原因是GC的加速,better generated code,核心库的优化
====Core library====
Transparent Monotonic Time support:看不懂
New bit manipulation package:数学的bits运算,看不懂
Test helper func:(*T).Helper (*B).Helper
Concurrent maps:并发的maps操作是支持的,这个包在package sync中,map type。在多个goroutine的增删改是安全的
Profiler labels:runtime/pprof包现在支持对pprof加标签
====Minor changes====
不再一一列出,详情请看release notes
比较多的修改点有:database/sql, net/http, time
50 【Go版本变化】的更多相关文章
- Python3.0-3.6的版本变化
Table of Contents Python3.0 简单的变化 语法的变化 新语法 改动的语法 剩下的变化 Python3.1 Python3.2 Python3.3 Python3.4 Pyth ...
- 【RTOS】基于V7开发板的最新版uCOS-III V3.07.03程序模板,含MDK和IAR,支持uC/Probe,与之前版本变化较大
模板下载: 链接:https://pan.baidu.com/s/1_4z_Lg51jMT87RrRM6Qs3g 提取码:2gns 对MDK的AC6也做了支持:https://www.cnblog ...
- HttpClient 版本变化 转载
转载地址:http://my.oschina.net/u/577453/blog/173724 最近用到了HttpClient写爬虫,可能我有新版本强迫症,老是喜欢用新版本的东西(虽说新版本不一定好用 ...
- Oracle 最新版本变化 转帖
版本更迭 http://www.sohu.com/a/163264045_505827 Oracle Database的下一个版本将是 Oracle 18. 目的 为了更快的.通过每年的版本发布将新特 ...
- ambari2.6.50 openssl 版本问题:SSLError: Failed to connect. Please check openssl library versions. Openssl error upon host registration
I'm trying to register hostnames in Ambari but getting the error below. We tried to run yum update o ...
- [转]Docker版本变化和新版安装
本文转自:http://www.cnblogs.com/Peter2014/p/7704306.html Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版 ...
- jenkins结合svn检测版本变化执行shell脚本实现项目部署
工具: centos 7 jenkins-2.138.2-1.1.noarch.rpm,2018年10月10号最新版(简单rpm包安装见https://www.cnblogs.com/dannylin ...
- Docker版本变化和新版安装
Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施.容器 ...
- Appium原理及版本变化细节
Appium原理小结 Api接口调用selenium的接口,Android底层用android的instrumentation(API2.3+ 通过绑定另外一个独立的selendroid项目来实现的) ...
随机推荐
- 网络ping不通原因总结
1.检查主机是否在线,硬件是否连接好 2.查看ip地址是否输入正确 3.查看是否防火墙拦截,如果有拦截关闭防火墙 4.两台电脑是否接入同一局域网(WiFi也是)
- LeetCode - Unique Email Addresses
Every email consists of a local name and a domain name, separated by the @ sign. For example, in ali ...
- day51 django第二天 django初识
一.模块渲染 jinja2 实现简单的字符串替换(动态页面) 1.下载 pip install jinja2 示例 : html文件中 <!DOCTYPE html> <html ...
- oracle中如何修改用户名和密码
1.以Windows操作系统为例,打开命令提示符,输入命令sqlplus /nolog ,进入oracle控制台,并输入 conn /as sysdba;以DBA角色进入. 2.连接成功后,输入“se ...
- 文件-- 字节相互转换(word、图片、pdf...)
方式一: /// <summary> /// word文件转换二进制数据(用于保存数据库) /// </summary> /// <param name="wo ...
- Delphi操作Ini文件
Delphi提供了一个TInifile类,使我们可以非常灵活的处理INI文件 一.INI文件的结构[小节名]ini文件 关键字1=值1 关键子2=值2INI文件允许有多个小节, ...
- Centos7 安装redis集群哨兵模式
https://blog.csdn.net/lihongtai/article/details/82826809
- 利用MYSQL的函数实现用户登录功能,进出都是JSON(第一版)
以HMAC密钥形式发放密钥令牌 功能如下 1:记录用户的登录的IP地址.时间 2:实现密码错误次数超限后锁定,并提示何时解锁 CREATE DEFINER=`root`@`%` FUNCTION `u ...
- js基础系列之【原型和原型链】
声明:形成本文的出发点仅仅是个人总结记录,避免遗忘,并非详实的教程:文中引用了经过个人加工的其它作者的内容,并非原创.学海无涯 引入问题 一般我们是这样写的: (需求驱动技术,疑问驱动进步) // 构 ...
- 第25课 可变参数模板(6)_function_traits和ScopeGuard的实现
1. function_traits (1)function_traits的作用:获取函数的实际类型.返回值类型.参数个数和具体类型等.它能获取所有函数语义类型信息.可以获取普通函数.函数指针.std ...