Go1.9值得我们关注的一些细节

  1. 类型别名
  2. 支持并行编译,多核同时编译包
  3. x*y + z 不舍入中间结果x*y。强制中间舍入,写float64(x*y) + z。
  4. Resolver.Dial 允许自定义DNS解析的拨号,通常可以用于代理或者拦截。
  5. httputil.ReverseProxy 支持代理HTTP2,可以用户做代理转发使用。
  6. 在Unix系统中SSL_CERT_FILE 、SSL_CERT_DIR环境变量可以代替系统默认的证书信任库。
  7. http.Transport现在支持使用SOCKS5代理(之前只支持HTTP代理),通过 Transport.Proxy 指定。
  8. 现在支持文件IO操作的异步poller机制,之前只有网络socket才支持,1.8以前文件的并发读写将会导致创建多个线程,现在网络一样可以高效并发。
  9. 新增NullBytesNullRawValue 表示ASN.1 NULL类型。
  10. 新的sync.Map类型,支持并发操作(性能优化过,比直接使用锁效能更好)
    • GC在使用包含许多大对象的大型(> 50GB)堆的应用程序中,大对象分配性能显着提高。
  11. runtime.ReadMemStats 功能即使对于非常大的堆也需要不到100μs 的功能。
  12. 要以编程的方式检索堆栈,应该使用runtime.CallersFrames 代替 runtime.Callers。或使用 runtime.Caller 获取有关单个调用者的信息。

    • 具体来说,直接迭代PC切片并使用诸如runtime.FuncForPC 单独解析每个PC的功能的代码 将错过内联框架。要获得堆栈的完整视图,应该使用这样的代码 CallersFrames。同样,代码不应该假定返回的长度 Callers是呼叫深度的任何指示。它应该计算返回的帧数 CallersFrames。
    • runtime.CallersFrames 从Go 1.7开始就可以使用
  13. go test 命令接受一个新的-list标志,只打印匹配的测试用例,而不去执行。

  14. go test ./...不再匹配vendor里的包,如需匹配,请明确指定./vendor/...