Go 1.8 简介

最新的Go版本1.8版比Go 1.7版本晚了六个月。它的大部分更改是在工具链,runtime, 和 libraries的实现上。语言规范有两个小的更改。与往常一样,该版本保留了Go 1兼容性的承诺。我们希望几乎所有Go程序都能像以前一样继续编译和运行。

该版本增加了对32位MIPS的支持, 更新了编译器后端以生成更有效的代码, 通过消除 stop-the-world的堆栈重新扫描来减少了GC暂停, 增加了HTTP / 2 Push支持, 增加了HTTP正常关机, 增加了更多上下文支持, 启用互斥分析,并简化切片排序。

语言更改

在Go 1.8中,当显式地将一个值从一种结构类型转换为另一种结构类型时,标记会被忽略。因此,两个结构体,仅在它们的标签上不同,可以从一个转换为另一个:

func example() {type T1 struct {X int `json:"foo"`}type T2 struct {X int `json:"bar"`}var v1 T1var v2 T2v1 = T1(v2) // now legal
}

语言规范现在只要求实现支持浮点常量中最多16位的指数。这不会影响“gc”或gccgo编译器,两者都支持32位指数。

ports

Go现在支持Linux上的32位MIPS,无论是大端机器(Linux / MIPS)还是小端机器(Linux /mipsle),它们通过FPU或内核FPU仿真实现MIPS32r1指令集。注意,许多基于mips的普通路由器都没有FPU,而且固件不支持内核FPU仿真;Go不能在这样的机器上运行。

在DragonFly BSD上,Go现在需要DragonFly 4.4.4或更高版本。

在OpenBSD上,Go现在需要OpenBSD 5.9或更高版本。

Plan 9端口的网络支持现在更加完整,并且在截止日期和取消方面与Unix和Windows的行为相匹配。有关Plan 9的内核需求,请参阅 Plan 9 wiki 页面。

Go 1.8现在只支持OS X 10.8或更高版本。这可能是支持10.8的最后一个Go版本。在旧的OS X版本上编译Go或运行二进制文件没有经过测试。

Go 1.8将是在ARMv5E和ARMv6处理器上支持Linux的最后一个版本:Go 1.9可能需要ARMv6K(在Raspberry Pi 1中可以找到)或更高版本。确定是否ARMv6K Linux系统,运行“工具dist -check-armv6k”(为了便于测试,也可以复制dist命令系统没有安装1.8)的一个完整副本,如果程序终止与输出“ARMv6K支持”。系统实现了ARMv6K或后。去非linux ARM系统已经需要ARMv6K或更高版本。

已知的问题

在FreeBSD和NetBSD上有一些已知但不被理解的不稳定因素。在极少数情况下,这可能会导致程序崩溃。见第15658期和第16511期。对于解决这些问题的任何帮助,我们将不胜感激。

tools

汇编程序

如果是64位x86系统,则增加了VBROADCASTSD、BROADCASTSS、MOVDDUP、MOVSHDUP、MOVSLDUP、VMOVDDUP、VMOVSHDUP和VMOVSLDUP。

对于64位PPC系统,公共向量标量指令已经添加: LXS, LXSDX, LXSI, LXSIWAX, LXSIWZX, LXV, LXVD2X, LXVDSX, LXVW4X, MFVSR, MFVSRD, MFVSRWZ, MTVSR, MTVSRD, MTVSRWA, MTVSRWZ, STXS, STXSDX, STXSI, STXSIWX, STXV, STXVD2X, STXVW4X, XSCV, XSCVDPSP, XSCVDPSPN, XSCVDPSXDS, XSCVDPSXWS, XSCVDPUXDS, XSCVDPUXWS, XSCVSPDP, XSCVSPDPN, XSCVSXDDP, XSCVSXDSP, XSCVUXDDP, XSCVUXDSP, XSCVX, XSCVXP, XVCV, XVCVDPSP, XVCVDPSXDS, XVCVDPSXWS, XVCVDPUXDS, XVCVDPUXWS, XVCVSPDP, XVCVSPSXDS, XVCVSPSXWS, XVCVSPUXDS, XVCVSPUXWS, XVCVSXDDP, XVCVSXDSP, XVCVSXWDP, XVCVSXWSP, XVCVUXDDP, XVCVUXDSP, XVCVUXWDP, XVCVUXWSP, XVCVX, XVCVXP, XXLAND, XXLANDC, XXLANDQ, XXLEQV, XXLNAND, XXLNOR, XXLOR, XXLORC, XXLORQ, XXLXOR, XXMRG, XXMRGHW, XXMRGLW, XXPERM, XXPERMDI, XXSEL, XXSI, XXSLDWI, XXSPLT, and XXSPLTW.

Yacc

yacc工具(以前可以通过运行“go tool yacc”获得)已经被删除。到Go 1.7时,Go编译器不再使用它。它已经转移到“工具”存储库,现在可以在 golang.org/x/tools/cmd/goyacc 上获得。

Fix

修复工具有一个新的 “context” 修复,可以将导入的内容从“golang.org/x/net/context”更改为“context”。

Pprof

pprof工具现在可以配置TLS服务器,并通过使用 “https+insecure” URL方案跳过证书验证。

callgrind 输出现在具有指令级别的粒度。

Trace

跟踪工具有一个新的-pprof标志,用于从执行跟踪生成与pprof兼容的阻塞和延迟配置文件。

垃圾收集事件现在在执行跟踪查看器中显示得更清楚了。垃圾收集活动显示在自己的行中,GC助手goroutines被标注为它们的角色。

Vet

Vet 在某些方面更加严格,在以前导致 false positives 的地方更加宽松。

Vet现在检查是否复制锁数组、复制JSON和XML struct字段标记、非空格分隔的struct标记、对HTTP Response.Body的延迟调用。在检查错误之前关闭,并在Printf中索引参数。它还改进了现有的检查。

Compiler Toolchain

Go 1.7 为64位x86系统引入了新的 compiler 。在Go 1.8中,该后端得到了进一步的开发,现在用于所有架构。

新的后端基于静态单赋值表单(SSA),生成更紧凑、更高效的代码,并为诸如边界检查消除等优化提供了更好的平台。在32位ARM系统上,新的后端将我们的基准程序所需的CPU时间减少20-30%。对于已经在Go 1.7中使用了SSA后端的64位x86系统,其收益是较为温和的0-10%。其他架构可能会看到更接近32位ARM数字的改进。

Go 1.7中引入的临时 -ssa=0 编译器标志已经在Go 1.8中删除了。

除了为所有系统启用新的编译器后端之外,Go 1.8还引入了新的编译器前端。新的编译器前端对用户来说不应该是显而易见的,但它是未来性能工作的基础。

编译器和链接器已经被优化,在这个版本中比Go 1.7运行得更快,尽管它们仍然比我们希望的要慢,并且在未来的版本中还会继续优化。与之前的版本相比,Go 1.8大约快了15%。

Cgo

Go工具现在记住make期间设置的CGO_ENABLED环境变量的值。默认情况下,将bash应用到所有未来的编译中,以修复 #12808 问题。在进行本机编译时,很少需要显式地将CGO_ENABLED环境变量设置为make。bash将自动检测正确的设置。显式设置CGO_ENABLED环境变量的主要原因是当您的环境支持cgo,但您显式不希望cgo支持,在这种情况下,在make期间设置CGO_ENABLED=0 在 make.bash 或 all.bash。

现在可以使用环境变量PKG_CONFIG来设置要运行的程序来处理#cgo pkg-config指令。默认值是pkg-config,早期版本总是使用这个程序。这是为了使交叉编译cgo代码更容易。
cgo工具现在支持go命令使用的-srcdir选项。

如果cgo代码调用C.malloc,而malloc返回NULL,程序将因内存不足错误而崩溃。C.malloc永远不会返回nil。与大多数C函数不同,C.malloc不能用于返回errno值的双结果形式。

如果cgo被用来调用一个C函数,它传递一个指向C联合函数的指针,如果C联合函数可以包含任何指针值,并且启用了cgo指针检查(默认情况下),那么现在会检查联合函数的值是否有Go指针。

Gccgo

由于Go的半年发布计划与GCC的年度发布计划一致,GCC release 6包含了gccgo的Go 1.6.1版本。我们期望下一个发行版GCC 7将包含gccgo的Go 1.8版本。

Default GOPATH

如果没有设置GOPATH环境变量,它现在有一个默认值。Unix上默认为$HOME/go, Windows上默认为%USERPROFILE%/go。

Go get

“go get”命令现在总是尊重HTTP代理环境变量,而不管是否使用了-insecure标志。在以前的版本中,-insecure标志有不使用代理的副作用。

Go bug

新的“go bug”命令在GitHub上启动一个bug报告,预填充当前系统的信息。

Go doc

“go doc”命令现在根据godoc的行为,将常量和变量与它们的类型进行分组。

为了提高doc输出的可读性,第一级项的每个摘要都保证占据一行。

现在可以请求接口定义中特定方法的文档,如“go doc net.Conn.SetDeadline”。

Plugins

Go现在提供了对插件的早期支持,通过一个“plugin”构建模式来生成用Go编写的插件,以及一个新的插件包来在运行时加载这些插件。插件支持目前仅在Linux上可用。有任何问题请报告。

Runtime

Argument Liveness

垃圾收集器不再认为实参存在于整个函数中。有关更多信息以及如何强制变量保持活动状态的信息,请参阅运行时。Go 1.7中增加的KeepAlive功能。

更新:在已分配对象上设置终结器的代码可能需要向运行时添加调用。使用该对象的函数或方法中的KeepAlive。更多细节请阅读KeepAlive文档及其示例。

Concurrent Map Misuse

在Go 1.6中,运行时添加了轻量级的、最有效的map并发误用检测。这个版本改进了该检测器,支持检测并发写入和遍历映射的程序。

和往常一样,如果一个goroutine正在写一个map,其他的goroutine就不应该并发地读(包括迭代)或写这个map。如果运行时检测到这种情况,它将打印一个诊断并使程序崩溃。了解更多问题的最好方法是在竞赛检测器下运行程序,这将更可靠地识别竞赛并给出更多细节。

MemStats Documentation

runtime.MemStats 类型已经有了更完整的文档。

Standard library

Examples

在许多包的文档中都添加了示例。

Sort

sort包现在包含一个方便的函数slice,用于对给定的函数更少的 slice 进行排序。在许多情况下,这意味着不需要编写新的排序器类型。

HTTP/2 Push

net/http包现在包含了从处理程序发送HTTP/2服务器推送的机制。与现有的flush和Hijacker接口类似,HTTP/2 ResponseWriter现在实现了新的Pusher接口。

HTTP Server Graceful Shutdown

HTTP服务器现在支持使用新服务器进行安全关闭。关闭方法和使用新服务器突然关闭。关闭方法。

More Context Support

继续Go 1.7对上下文的采用。在标准库中,Go 1.8为现有的包添加了更多的上下文支持:

新的服务器。Shutdown带一个context参数。

在数据库/sql包中增加了具有上下文支持的重要内容。

新网络上的所有9个新查找方法。解析器现在采用上下文。

互斥锁争用分析

运行时和工具现在支持分析争用互斥对象。

大多数用户都希望使用带有“go test”的新的-mutexprofile标志,然后在生成的文件上使用pprof。

低级别的支持也可以通过新的MutexProfile和SetMutexProfileFraction获得。

Go 1.8的一个已知限制是,概要文件只报告争用同步。互斥对象,而不是sync.RWMutex。

Minor changes to the library

和往常一样,这个库有各种各样的小的变化和更新,这是出于Go 1对兼容性的承诺。以下部分列出了用户可见的更改和添加内容。优化和小的错误修复没有列出。

archive/tar

tar实现纠正了在文件格式的极端情况下的许多错误。阅读器现在能够处理PAX格式的大于8GB的tar文件。在某些涉及长路径名的情况下,写入器不再生成无效的tar文件。

compress/flate

有一些小的修复编码器,以提高压缩比在某些情况下。因此,DEFLATE的精确编码输出可能与Go 1.7不同。

因为DEFLATE是gzip、png、zlib和zip的底层压缩,所以这些格式的输出可能发生了变化。

编码器在NoCompression模式下操作时,现在产生一致的输出,不依赖于传递给Write方法的片的大小。
在遇到错误时,解码器将返回它已解压的所有缓冲数据以及错误。

compress/gzip

写入者现在编码一个零的MTIME字段时,头。ModTime字段为零值。在以前的Go版本中,编写者将编码一个无意义的值。类似地,读取器现在报告一个零编码的MTIME字段为零Header.ModTime。

context

DeadlineExceeded错误现在实现net。错误,并且超时和临时方法报告为true。

crypto/tls

新方法Conn.CloseWrite允许TLS连接半封闭。

新的方法Config。克隆对TLS配置进行克隆。

新的配置。GetConfigForClient回调允许根据客户端的ClientHelloInfo动态选择客户端的配置。ClientHelloInfo结构现在有了新的字段Conn、signaturesscheme(使用新的类型signaturesscheme)、SupportedProtos和SupportedVersions。

新的配置。GetClientCertificate callback允许基于服务器的TLS CertificateRequest消息选择客户端证书,该消息由新的CertificateRequestInfo表示。

新的配置。KeyLogWriter允许在WireShark和类似工具中调试TLS连接。

新的配置。VerifyPeerCertificate回调允许对对等体提供的证书进行额外的验证。

crypto/tls包现在实现了针对CBC填充oracle的基本对策。不应该存在显式的依赖于秘密的计时,但它不会试图规范化内存访问以防止缓存计时泄漏。

crypto/tls包现在支持X25519和ChaCha20-Poly1305。除非有对AES-GCM的硬件支持,否则ChaCha20-Poly1305现在是优先级。

现在也支持带有SHA-256的AES-128-CBC密码套件,但默认禁用。

crypto/x509

现在支持PSS签名。

UnknownAuthorityError现在有一个证书字段,报告不受信任的证书。

证书验证在一些情况下更允许,在其他一些情况下更严格。

现在还可以在/etc/pki/ca-trust/extracted/pem/tls-ca-bundle中查找根证书。支持RHEL和CentOS操作系统。

database/sql

这个包现在支持context.Context。有一些以上下文结尾的新方法,比如DB。QueryContext和DB。带context参数的PrepareContext。使用新的上下文方法可以确保在请求完成时连接被关闭并返回到连接池;允许取消正在进行的查询,如果驱动程序支持;并允许数据库池取消等待下一个可用连接。

现在可以在启动事务时通过在TxOptions上设置隔离级别来设置隔离级别。隔离并将其传递给DB.BeginTx。如果选择了驱动程序不支持的隔离级别,将返回错误。还可以通过设置TxOptions在事务上设置只读属性。只读的,真的。

查询现在公开支持它的驱动程序的SQL列类型信息。行可以返回列类型,列类型包括SQL类型信息、列类型长度和Go类型。

行现在可以表示多个结果集。后的行。下一个返回false,行。NextResultSet可能会被调用以前进到下一个结果集。现有的行应该在前进到下一个结果集后继续使用。

NamedArg可以用作查询参数。新函数Named帮助更简洁地创建NamedArg。

如果驱动程序支持新的ping接口,则DB。萍和DB。PingContext方法将使用该接口检查数据库连接是否仍然有效。

新的上下文查询方法适用于所有的驱动程序,但是除非驱动程序被更新以使用它们,否则上下文取消不会响应。其他特性需要在database/sql/driver中支持驱动程序。驱动程序作者应该检查新的接口。现有驱动程序的用户应该查看驱动程序文档,看看它支持什么,以及关于每个特性的任何系统特定文档。

其他更多请查看官网。。。

goalng1.8 的变化相关推荐

  1. Go 1.16 的这个新变化需要适应下:go get 和 go install 的变化

    原文地址: Go 1.16 的这个新变化需要适应下:go get 和 go install 的变化 一直以来,go get 用于下载并安装 Go 包.命令等,而 go install 在 module ...

  2. OpenCV 图像处理系列(6)—— 图像的几何变化

    图像的几何变换 OpenCV 提供了两个变换函数,cv2.warpAffine 和 cv2.warpPerspective,使用这两个函数你可以实现所有类型的变换.cv2.warpAffine 接收的 ...

  3. 表格下划线怎么加粗_这招高!Excel签名栏的下划线随列宽变化,是不是感觉牛哄哄的?...

    职场牛人的世界总有各种高招,随手蹦出,令人赞叹不已! 今天早上去填一个表格,在输入签名时,突然发现签名处的下划线是随着列宽的变化而自动变化,这绝对是动态的,这是怎么做到的呢? 我特意看了一下这个单元格 ...

  4. mysql 二进制日志变化_mysql-二进制日志

    mysql---二进制日志 记录了所有对MySQL数据库的修改事件,包括增删改查事件和对表结构的修改事件 二进制日志的开启 #是否启用了日志 mysql> show variables like ...

  5. java监听mysql_java实时监控mysql数据库变化

    对于二次开发来说,很大一部分就找找文件和找数据库的变化情况 对于数据库变化.还没有发现比较好用的监控数据库变化监控软件. 今天,我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1.打开数 ...

  6. 【bootstrap】如何解决页面缩小后上方导航栏格式变化的问题

    问题描述: bootstrap官方模板中上方导航栏当缩小到一定程度后会发生格式的变化,但我想取消这种变化 页面缩小前: 页面缩小后: 解决方法: 经过阅读bootstrap的css代码后发现了这么一行 ...

  7. Storybook 5.0正式发布:有史以来变化最大的版本\n

    Storybook 5.0(SB5)于近日正式发布,这是目前为止最大的一个版本.新版本的内容包括: 全新的开发者体验: 带有主题的组件库: 改进的前端插件架构: 全新的Storybook网站. Sto ...

  8. Centos7.x系统配置上的变化【转】

    安装CentOS 7后,一开始有点儿无力吐槽的感觉,变化这么大? 一:Runlevel 二:Services 三:网络 四:ip ss指令替代 ifconfig route arp netstat 五 ...

  9. 浏览器及时感知服务端数据变化的方式

    需求 在公司,有一个需求,是浏览器实时获取服务端数据变化,然后根据变化做相应的动作.需求场景如下:手机端扫描二维码,然后获取待取件订单列表,点击取件,进行取件,同时远端打印机打印出取件小票. 技术难点 ...

最新文章

  1. 关键词优化一定要从正规渠道入手
  2. 机器学习之正则化图文讲解
  3. C语言实现queue队列的算法(附完整源码)
  4. C语言 将整数写入内存指定的连续字节单元中
  5. idea怎么运行eclipse的web项目_Apache Storm v2.0入门项目的开发、测试和运行(IDEA/Maven)...
  6. LeetCode 343. 整数拆分(动态规划)
  7. 如何求递归算法的时间复杂度
  8. 青年大学习分类收集截屏小程序
  9. 如何使用Arduino开发板读/写SD卡模块的数据
  10. 商品id- item_id /条形码/skuid
  11. 操作系统之——进程管理:同步进程和进程互斥
  12. MySQL完全卸载干净(图解)
  13. 热门Java开发工具IDEA入门指南——IntelliJ IDEA概述(下)
  14. ADXL345 驱动代码
  15. VS2010中使用NeatUpload实现简单的文件上传功能
  16. 单片机设计一个十字路口交通灯模拟控制系统(51单片机实训)
  17. c 语言中并查集的用法,并查集基本介绍
  18. 最详细破解nessus(windows)教程 插件更新至20220830
  19. beast软件linux用法,杂项类设置 - 黑苹果驱动高手篇 MultiBeast用法进阶_Linux教程_Linux公社-Linux系统门户网站...
  20. 本科生学计算机科学行吗,【学习方法】一位大三本科生的计算机科学与技术学习反思录...

热门文章

  1. 雨林木风(YLMF)经典操作系统大全
  2. 五年内买车买房——理财篇
  3. 简单步骤搞定Eclipse低调黑色主题(和代码颜色风格)
  4. 计算机二级---关键必要掌握重点
  5. 将base64格式的图片画到canvas上(js和vue两种)
  6. 调用第三方接口开据发票
  7. 伪原创文章生成器软件
  8. 通过picgo+gitee搭建图床
  9. 自创小说《彩虹雨》连载(三)
  10. KEIL新建STM32F030F工程文件