Go 1.10 Release Notes

Introduction to Go 1.10

最新的Go版本1.10版在Go 1.9之后六个月到来. 它的大部分更改是在工具链,运行时和库的实现中进行的. 与往常一样,该发行版保留了Go 1 兼容性的承诺 . 我们希望几乎所有Go程序都能像以前一样继续编译和运行.

这个版本改善了内置包的 缓存 ,增加了成功测试结果的缓存, 在测试期间自动运行vet ,并允许使用cgo在Go和C之间直接传递字符串值 . 新的编译器选项白名单可能会在使用旧版本成功构建的代码中导致意外的invalid flag错误.

Changes to the language

语言规范没有重大变化.

澄清了涉及无类型常量移位的特殊情况,结果,编译器已更新为允许索引表达式x[1.0 << s] ,其中s是无符号整数; go / types包已经完成了.

方法表达式的语法已更新,以放宽语法,以允许任何类型的表达式作为接收器; 这与编译器已经实现的功能匹配. 例如, struct{io.Reader}.Read是有效的方法表达式,如果不寻常,则是编译器已经接受的方法表达式,并且现在已被语言语法所允许.

Ports

此版本中没有新的受支持的操作系统或处理器体系结构. 大部分工作都集中在加强对现有端口的支持上,特别是在汇编程序中的新指令以及对编译器生成的代码的改进上.

正如Go 1.9发行说明中宣布的那样 ,Go 1.10现在需要FreeBSD 10.3或更高版本. 对FreeBSD 9.3的支持已被删除.

Go现在可以再次在NetBSD上运行,但需要未发布的GOARCH .仅GOARCH amd64386 . arm端口仍然损坏.

在32位MIPS系统上,新的环境变量设置GOMIPS=hardfloat (默认值)和GOMIPS=softfloat选择是使用硬件指令还是软件仿真来进行浮点计算.

Go 1.10是将在OpenBSD 6.0上运行的最新版本. Go 1.11将需要OpenBSD 6.2.

Go 1.10是将在OS X 10.8 Mountain Lion或OS X 10.9 Mavericks上运行的最新版本. Go 1.11需要OS X 10.10 Yosemite或更高版本.

Go 1.10是将在Windows XP或Windows Vista上运行的最新版本. 1.11版将需要Windows 7或更高版本.

Tools

Default GOROOT & GOTMPDIR

如果未设置环境变量$GOROOT ,则go工具先前在工具链编译期间使用了默认的GOROOT集. 现在,在回到默认值之前,go工具会尝试从其自己的可执行路径中推论GOROOT . 这样就可以在文件系统中的任何位置解压缩二进制发行版,然后在不显式设置GOROOT情况下使用二进制发行版.

默认情况下,go工具在系统临时目录(例如Unix上的$TMPDIR )中创建其临时文件和目录. 如果设置了新的环境变量$GOTMPDIR ,则go工具将在该目录中创建其临时文件和目录.

Build & Install

现在, go build命令仅基于源文件的内容,指定的构建标志以及存储在已编译软件包中的元数据来检测过时的软件包. 修改时间不再参考或不相关. 在修改时间由于某种原因而引起误导的情况下(例如,构建标记的更改),不再需要添加-a来强制进行重新构建的旧建议:现在,构建始终可以检测何时必须重新构建软件包. (如果您另有观察,请提交错误.)

现在,默认情况下, go build -asmflags-gcflags-gccgoflags-ldflags选项仅适用于直接在命令行中列出的软件包. 例如, go build -gcflags=-m mypkg在构建mypkg时将-m标志传递给编译器,但不传递其依赖项. 新的更通用的形式-asmflags=pattern=flags (其他类似)将flags仅应用于与该模式匹配的软件包. 例如: go install -ldflags=cmd/gofmt=-X=main.version=1.2.3 cmd/...安装所有与cmd/...匹配的cmd/...但仅将-X选项应用于cmd/gofmt的链接器标志cmd/gofmt . 有关更多详细信息,请参阅go help build .

go build命令现在维护最近构建的软件包的缓存,与$GOROOT/pkg$GOPATH/pkg已安装的软件包分开. 高速缓存的作用应该是加快未显式安装软件包的构建速度,或者在源代码的不同副本之间切换时(例如,在版本控制系统中的不同分支之间来回切换时). 在go build -igo test -i ,不再需要为速度添加-i标志的旧建议:在没有-i情况下,构建的运行速度一样快. 有关更多详细信息,请参阅go help cache .

go install命令现在仅安装直接在命令行上列出的软件包和命令. 例如, go install cmd/gofmt将安装gofmt程序,但不会安装它所依赖的任何软件包. 新的构建缓存使以后的命令仍能像已安装依赖项一样快地运行. 要强制安装依赖项,请使用新的go install -i标志. 通常,不需要安装依赖软件包,并且已安装软件包的概念在将来的发行版中可能会消失.

go build实现的许多细节已更改以支持这些改进. 这些更改暗示的一个新要求是,仅二进制软件包现在必须在其存根源代码中声明准确的导入块,以便在使用仅二进制软件包链接程序时可以使这些导入可用. 有关更多详细信息,请参阅go help filetype .

Test

go test命令现在可以缓存测试结果:如果测试可执行文件和命令行与先前的运行相匹配,并且该运行所查询的文件和环境变量也未更改,则go test将输出先前的测试输出,用字符串"(已缓存)".测试缓存仅适用于成功的测试结果. 只有go test命令与包装的显式列表; 并且仅用于使用-cpu-list-list-parallel-run-short-v测试标志的子集的命令行. 绕过测试缓存的惯用方式是使用-count=1 .

go test命令现在可以在go测试的软件包上自动运行go vet ,以在运行测试之前识别出重大问题. 任何此类问题都将被视为构建错误,并阻止执行测试. 只有可用的高可信度的子集go vet检查该自动检查功能. 要禁用go vet的运行, go使用go test -vet=off .

现在, go test -coverpkg标志将其参数解释为以逗号分隔的模式列表,以与每个测试的依赖项进行匹配,而不是作为要重新加载的软件包列表. 例如, go test -coverpkg=all现在是一种运行测试的有意义的方法,该测试为测试包及其所有依赖项启用了覆盖率. 此外,现在在运行多个测试时支持go test -coverprofile选项.

万一由于超时而失败,测试现在更有可能在退出之前写入其配置文件.

现在, go test命令始终合并来自给定测试二进制执行的标准输出和标准错误,并将两者写入go test的标准输出. 在过去的版本中, go test在大多数情况下仅适用于此合并.

go test -v输出现在包括PAUSECONT状态更新行,以标记并行测试何时暂停和继续.

任何测试失败后,新的go test -failfast标志将禁用运行其他测试. 请注意,允许与失败的测试并行运行的测试.

最后,新的go test -json标志通过新命令go tool test2json过滤测试输出,以生成机器可读的JSON格式的测试执行描述. 这允许在IDE和其他工具中创建丰富的测试执行演示.

有关所有这些更改的更多详细信息,请参阅go help testtest2json文档 .

Cgo

现在对照允许的选项白名单检查由cgo使用#cgo CFLAGS等指定的选项. 这-fplugin了一个安全漏洞,在该漏洞中,下载的软件包使用-fplugin类的编译器选项在生成该软件包的-fplugin上运行任意代码. 这可能会导致生成错误,例如invalid flag in #cgo CFLAGS . 有关更多背景以及如何处理此错误,请参见https://golang.org/s/invalidflag .

Cgo现在使用Go类型别名实现C typedef,例如" typedef X Y ",因此Go代码可以互换使用CXCY类型. 现在,它还支持使用类似niladic函数的宏. 此外,文档已更新,以澄清cgo导出函数的类型签名中不支持Go结构和Go数组.

Cgo现在支持从C直接访问Go字符串值.C序言中的函数可以使用_GoString_类型接受Go字符串作为参数. C代码可以调用_GoStringLen_GoStringPtr以直接访问字符串的内容. _GoString_类型的值可以在对导出的Go函数的调用中传递,该函数采用Go类型string的参数.

在工具链引导期间,环境变量CCCC_FOR_TARGET指定默认的C编译器,生成的工具链将分别用于宿主和目标构建. 但是,如果工具链将与多个目标一起使用,则可能有必要为每个目标指定不同的C编译器(例如, darwin/arm64linux/ppc64le编译器不同). _ allows specifying a different default C compiler for each target. 这套新的环境变量的CC_FOR_ _ 允许为每个目标不同的默认C编译器. 请注意,这些变量仅在工具链引导过程中适用,以设置结果工具链使用的默认值. 以后go build命令时,请使用CC环境变量或内置的默认变量.

Cgo现在将一些通常会映射到Go中的指针类型的C类型转换为uintptr . 这些类型包括Darwin的CoreFoundation框架中的CFTypeRef层次结构和Java的JNI接口中的jobject层次结构.

在Go端,这些类型必须是uintptr ,因为否则它们会混淆Go垃圾收集器. 它们有时不是真正的指针,而是以指针大小的整数编码的数据结构. Go内存的指针一定不能存储在这些uintptr值中.

由于此更改,受影响的类型的值需要使用常量0而不是常量nil进行零初始化. Go 1.10提供了gofix模块来帮助重写:

go tool fix -r cftype <pkg>
go tool fix -r jni <pkg>

For more details, see the cgo documentation.

Doc

现在, go doc工具将返回T*T切片的函数添加到类型T的显示中,类似于返回单个T*T结果的函数的现有行为. 例如:

$ go doc mail.Address
package mail // import "net/mail"

type Address struct {
	Name    string
	Address string
}
    Address represents a single mail address.

func ParseAddress(address string) (*Address, error)
func ParseAddressList(list string) ([]*Address, error)
func (a *Address) String() string
$

以前, ParseAddressList仅显示在程序包概述中( go doc mail ).

Fix

现在, go fix工具将"golang.org/x/net/context"导入替换为"context" . (使用Go 1.9或更高版本时,前者中的转发别名使其与后者完全等效.)

Get

go get命令现在支持Fossil源代码存储库.

Pprof

由所产生的阻塞和互斥型材runtime/pprof包现在包括符号信息,所以它们可以在被视为go tool pprof而不产生该轮廓二进制. (已更改所有其他概要文件类型,以在Go 1.9中包含符号信息.)

go tool pprof型材可视化工具已经更新到Git版本9e20b5b(2017年11月8日)从github.com/google/pprof ,其中包括一个更新的Web界面.

Vet

The go vet command now always has access to complete, up-to-date type information when checking packages, even for packages using cgo or vendored imports. The reports should be more accurate as a result. Note that only go vet has access to this information; the more low-level go tool vet does not and should be avoided except when working on vet itself. (As of Go 1.9, go vet provides access to all the same flags as go tool vet.)

Diagnostics

此版本包括可用的Go程序诊断工具的新概述 .

Gofmt

Go源代码的默认格式的两个小细节已更改. 首先,某些复杂的三索引切片表达式先前的格式类似于x[i+1 : j:k] ,现在以更一致的间距进行格式化: x[i+1 : j : k] . 其次,写在单行上的单方法接口文字(有时在类型断言中使用)不再拆分成多行.

请注意,有时会对gofmt进行此类次要更新. 通常,建议不要使用构建系统检查源代码是否匹配特定版本的gofmt的输出. 例如,如果已经将任何已检入存储库的代码未"正确格式化",则连续集成测试会失败,这是固有的脆弱性,因此不建议这样做.

如果多个程序必须就使用gofmt的哪个版本来格式化源文件达成共识,我们建议它们通过安排调用相同的gofmt二进制文件来做到这一点. 例如,在Go开源存储库中,我们的Git预提交钩子是用Go编写的,可以直接导入go/format ,但是它会调用当前路径中找到的gofmt二进制文件,因此预提交钩子不需要每次gofmt更改时gofmt重新编译.

Compiler Toolchain

该编译器对生成的代码的性能进行了许多改进,并在支持的体系结构中平均分配.

二进制文件中记录的DWARF调试信息已通过以下几种方式进行了改进:现在记录常数值; 行号信息更准确,从而使源代码级程序更有效地工作; 现在,每个软件包都作为其自己的DWARF编译单元提供.

各种构建模式已移植到更多系统中. 具体来说, c-shared现在可以在linux/ppc64lewindows/386windows/amd64pie现在可以在darwin/amd64并且还可以在所有系统上强制使用外部链接; 并且plugin现在可以在linux/ppc64ledarwin/amd64 .

linux/ppc64le端口现在需要与使用cgo的任何程序进行外部链接,甚至使用标准库.

Assembler

对于ARM 32位端口,汇编器现在支持以下指令: BFCBFIBFXBFXUFMULADFMULAFFMULSDFMULSFFNMULADFNMULAFFNMULSDFNMULSFMULADMULAFMULSDMULSFNMULADNMULAFNMULDNMULFNMULSDNMULSFXTABXTABUXTAHXTAHU .

对于ARM 64位端口,汇编器现在支持VADDVADDPVADDVVANDVCMEQVDUPVEORVLD1VMOVVMOVIVMOVSVORRVREV32VST1指令.

针对PowerPC的64位端口,汇编器现在支持POWER9指令ADDEXCMPEQBCOPYDARNLDMXMADDHDMADDHDUMADDLDMFVSRLDMTVSRDDMTVSRWSPASTECCVCMPNEZBVCMPNEZBCC ,和VMSUMUDM .

For the S390X port, the assembler now supports the TMHH, TMHL, TMLH, and TMLL instructions.

对于X86 64位端口,汇编器现在支持359条新指令,包括完整的AVX,AVX2,BMI,BMI2,F16C,FMA3,SSE2,SSE3,SSSE3,SSE4.1和SSE4.2扩展集. 汇编程序也不再将MOVL $0, AXXORL指令,以避免意外清除条件标志.

Gccgo

由于Go的半年发布计划与GCC的年度发布计划保持一致,因此GCC第7版包含gccgo的Go 1.8.3版本. 我们希望下一个版本GCC 8将包含Go 1.10版本的gccgo.

Runtime

嵌套调用LockOSThreadUnlockOSThread的行为已更改. 这些函数控制goroutine是否锁定到特定的操作系统线程,以便goroutine仅在该线程上运行,而该线程仅运行该goroutine. 以前, LockOSThread多次调用LockOSThread等效于一次调用,并且单个UnlockOSThread始终会解锁线程. 现在,调用嵌套:如果LockOSThread调用LockOSThreadUnlockOSThread必须将UnlockOSThread调用相同的次数才能解锁线程. 注意不要嵌套这些调用的现有代码将保持正确. 错误地假定嵌套调用的现有代码将变得正确. 这些功能在公共Go源代码中的大多数使用属于第二类.

因为LockOSThreadUnlockOSThread一种常用用法是允许Go代码可靠地修改线程本地状态(例如Linux或Plan 9名称空间),所以运行时现在将锁定的线程视为不适合重用或创建新线程.

Stack traces no longer include implicit wrapper functions (previously marked <autogenerated>), unless a fault or panic happens in the wrapper itself. As a result, skip counts passed to functions like Caller should now always match the structure of the code as written, rather than depending on optimization decisions and implementation details.

已对垃圾收集器进行了修改,以减少其对分配延迟的影响. 现在,它在运行时使用的CPU占整体CPU的比例较小,但可能会运行更多时间. 垃圾回收器消耗的总CPU并没有太大变化.

现在, GOROOT函数默认(在未设置$GOROOT环境变量时)为在调用程序编译时生效的GOROOTGOROOT_FINAL . 以前,它在编译调用程序的工具链时使用GOROOTGOROOT_FINAL .

GOMAXPROCS设置不再受限制. (在1.9版中,限制为1024.)

Performance

与往常一样,这些更改是如此笼统和多变,以至于很难对性能进行精确的表述. 由于垃圾收集器的加速,生成更好的代码以及核心库中的优化,大多数程序应运行得更快一些.

Garbage Collector

当垃圾收集器处于活动状态时,许多应用程序应显着降低分配延迟和总体性能开销.

Core library

对标准库的所有更改都是次要的. 字节网络/ URL的更改最有可能需要更新现有程序.

Minor changes to the library

与往常一样,对库的各种微小更改和更新都遵循了Go 1 的兼容性承诺 .

archive/tar

通常,特殊标头格式的处理已得到显着改善和扩展.

FileInfoHeader始终从其os.FileInfo参数(特别是从FileInfoSys方法返回的与系统有关的信息)中记录Unix UID和GID号在返回的Header . 现在,它还会记录与这些ID对应的用户名和组名,以及设备文件的主要和次要设备号.

Format类型的新Header.Format字段控制Writer使用的tar标头格式. 像以前一样,默认值是选择最广泛支持的标头类型,该类型可以编码标头所需的字段(如果可能,则为USTAR,如果可能,则为PAX,否则为GNU). Reader为读取的每个标头设置Header.Format .

现在, ReaderWriter使用新的Header.PAXRecords字段(现有Xattrs字段的概括)支持任意PAX记录.

Reader不再坚持GNU标头中的文件名或链接名是有效的UTF-8.

在编写PAX或GNU格式的标头时, Writer现在包括Header.AccessTimeHeader.ChangeTime字段(如果已设置). 编写PAX格式标题时,时间包括亚秒级精度.

archive/zip

Go 1.10添加了对ZIP档案中的时间和字符集编码的更完整支持.

原始的ZIP格式将年,月,日,小时,分钟和秒的标准MS-DOS编码转换为两个16位值的字段. 该编码不能表示时区或奇数秒,因此引入了多个扩展以允许更丰富的编码. 在Go 1.10中, ReaderWriter现在支持广为人知的Info-Zip扩展,该扩展以32位Unix"自纪元以来的秒数"形式分别编码时间. FileHeader的类型为time.Time的新的Modified字段使ModifiedTimeModifiedDate字段过时,它们继续保持MS-DOS编码. 现在, ReaderWriter Reader采用了一个通用约定,即存储与时区无关的Unix时间的ZIP归档文件还将本地时间存储在MS-DOS字段中,以便可以推断出时区偏移量. 为了兼容性, ModTimeSetModTime方法的行为与早期版本相同; 新代码应直接使用Modified .

ZIP存档中每个文件的标头都有一个标志位,用于指示名称和注释字段是否编码为UTF-8,这与系统特定的默认编码相反. 在Go 1.8和更低版本中, Writer从未设置UTF-8位. 在Go 1.9中, Writer几乎总是更改为将UTF-8位置1. 这破坏了包含Shift-JIS文件名的ZIP存档的创建. 在Go 1.10中,仅当名称和注释字段均为有效UTF-8并且至少一个为非ASCII时, Writer现在才设置UTF-8位. 由于非ASCII编码很少看起来像有效的UTF-8,因此新的启发式方法几乎一直都是正确的. 将FileHeader的新NonUTF8字段设置为true会完全禁用该文件的试探法.

Writer现在还支持通过调用Writer的新SetComment方法来设置中心目录末尾记录的注释字段.

bufio

The new Reader.Size and Writer.Size methods report the Reader or Writer's underlying buffer size.

bytes

FieldsFieldsFuncSplitSplitAfter函数始终返回其输入的子SplitAfter . Go 1.10更改了每个返回的子切片,使其容量等于其长度,因此追加到该子切片不能覆盖原始输入中的相邻数据.

crypto/cipher

NewOFB now panics if given an initialization vector of incorrect length, like the other constructors in the package always have. (Previously it returned a nil Stream implementation.)

crypto/tls

现在,使用TLS 1.2时,TLS服务器会公布对SHA-512签名的支持. 服务器已经支持签名,但是除非明确发布,否则某些客户端不会选择它们.

crypto/x509

现在, Certificate.Verify对证书中包含的所有名称强制执行名称约束,而不仅仅是客户端询问的名称. 现在,类似地一次检查扩展密钥使用限制. 结果,证书通过验证后,现在就可以完全信任它了. 不再需要为每个其他名称或密钥用法重新验证证书.

现在,已解析的证书还使用新的Certificate字段URIsPermittedIPRangesExcludedIPRangesPermittedEmailAddressesExcludedEmailAddressesPermittedURIDomainsExcludedURIDomains报告URI名称以及IP,电子邮件和URI约束. 现在将拒绝那些字段具有无效值的证书.

新的MarshalPKCS1PublicKeyParsePKCS1PublicKey函数可将RSA公钥与PKCS#1编码形式相互转换.

新的MarshalPKCS8PrivateKey函数将私钥转换为PKCS#8编码形式. (从Go 1开始存在ParsePKCS8PrivateKey .)

crypto/x509/pkix

Name现在实现一个String方法,该方法以标准RFC 2253格式设置X.509专有名称的格式.

database/sql/driver

当前保留在driver.Rows.Next提供的目标缓冲区中的驱动程序,应确保它们不再写入该调用之外分配给目标数组的缓冲区. 驱动程序必须注意关闭driver.Rows时不要修改基础缓冲区.

现在,想要为其客户端构造sql.DB驱动程序可以实现Connector接口并调用新的sql.OpenDB函数,而无需将所有配置编码为传递给sql.Open的字符串.

驱动程序要解析配置字符串每一次sql.DB ,而不是每一次sql.Conn ,或者希望获得每个sql.Conn的潜在背景下,可以使自己的Driver实现也实现DriverContext的新OpenConnector方法.

实现ExecerContext驱动程序不再需要实现Execer . 同样,实现QueryerContext驱动程序不再需要实现Queryer . 以前,即使实现了基于上下文的接口,也将忽略它们,除非还实现了基于非上下文的接口.

为了使驱动程序能够更好地连续使用缓存的驱动程序连接来更好地隔离不同的客户端,如果Conn实现了新的SessionResetter接口,则database/sql现在将在为新客户端重新使用Conn之前调用ResetSession .

debug/elf

此版本增加了348个新的重定位常量,分别在重定位类型R_386R_AARCH64R_ARMR_PPC64R_X86_64 .

debug/macho

Go 1.10使用Section struct的新Relocs字段以及新的RelocRelocTypeARMRelocTypeARM64RelocTypeGenericRelocTypeX86_64类型以及关联的常量,添加了对从Mach-O部分读取重定位的支持.

Go 1.10还添加了对LC_RPATH加载命令的支持(由类型RpathCmdRpath ,以及对标头中各种标志位的新命名常量 .

encoding/asn1

Marshal现在可以正确地将包含星号的字符串编码为UTF8String类型而不是PrintableString类型,除非该字符串位于带有强制使用PrintableString的标签的struct字段中. Marshal现在还尊重包含application指令的结构标记.

新的MarshalWithParams函数将其参数编组,就好像其他参数是其关联的struct字段标记一样.

Unmarshal现在使用explicittag指令来尊重结构域标记.

现在, MarshalUnmarshal都支持新的struct字段标记numeric ,表示ASN.1 NumericString.

encoding/csv

Reader现在禁止使用无意义的CommaComment设置,例如NUL,回车,换行符,无效的符文和Unicode替换字符,或者将CommaComment设置为相等.

如果跨多个输入行的CSV记录中出现语法错误, Reader现在将在ParseError的新StartLine字段中报告记录开始的那一行.

encoding/hex

新功能NewEncoderNewDecoder提供与十六进制之间的流转换,类似于encoding / base32encoding / base64中已经存在的等效函数.

当函数DecodeDecodeString遇到格式错误的输入时,它们现在将返回已转换的字节数以及错误. 以前,他们总是返回0且没有错误.

encoding/json

Decoder添加了新方法DisallowUnknownFields ,该方法使它将带有未知JSON字段的输入报告为解码错误. (默认行为始终是丢弃未知字段.)

由于修复了反射错误Unmarshal无法再将其解码为指向未导出结构类型的嵌入式指针中的字段,因为它无法初始化未导出的嵌入式指针以指向新鲜存储. 现在,在这种情况下, Unmarshal将返回错误.

encoding/pem

当出现无法编码为PEM数据的块时, EncodeEncodeToMemory不再生成部分输出.

encoding/xml

新功能NewTokenDecoder类似于NewDecoder但是创建一个从TokenReader读取的解码器,而不是XML格式的字节流. 这意味着可以在客户端库中构造XML流转换器.

flag

现在,默认的Usage函数将其第一行输出打印到CommandLine.Output()而不是假设使用os.Stderr ,以便使用CommandLine.SetOutput为客户端正确重定向用法消息.

现在, PrintDefaults在标志用法字符串中的换行符后添加适当的缩进,以便多行用法字符串显示良好.

FlagSet添加了新的方法ErrorHandlingNameOutput ,以检索传递给NewFlagSetFlagSet.SetOutput的设置.

go/doc

为了支持上述文档更改 ,现在在TTypeFuncs列表中而不是在PackageFuncs列表中报告返回T*T**T切片的函数.

go/importer

现在, For函数接受一个非null的查找参数.

go/printer

上面gofmt部分中讨论的Go源代码的默认格式更改在go / printer软件包中实现,并且还会影响更高级别的go / format软件包的输出.

hash

现在鼓励Hash接口的实现实现encoding.BinaryMarshalerencoding.BinaryUnmarshaler允许保存和重新创建它们的内部状态,并且标准库中的所有实现( hash / crc32crypto / sha256等)现在都实现这些接口.

html/template

新的Srcset内容类型允许正确处理img标签的srcset属性内的值.

math/big

Int现在在其SetStringText方法中支持从2到62的转换. (以前,它仅允许2到36为底.)常数MaxBase的值已更新.

Int添加了一个新的CmpAbs方法,该方法类似于Cmp但仅比较其参数的绝对值(而不是符号).

Float添加了新的Sqrt方法来计算平方根.

math/cmplx

Branch cuts and other boundary cases in Asin, Asinh, Atan, and Sqrt have been corrected to match the definitions used in the C99 standard.

math/rand

新的Shuffle功能和相应的Rand.Shuffle方法可随机播放输入序列.

math

新函数RoundRoundToEven其参数四舍五入到最接近的浮点整数. Round一个半整数RoundToEven到其较大的整数邻居(远离零),而RoundToEven一个半整数RoundToEven入到其偶数整数邻居.

新函数ErfinvErfcinv计算逆误差函数和逆互补误差函数.

mime/multipart

Reader现在接受带有空文件名属性的部分.

mime

ParseMediaType now discards invalid attribute values; previously it returned those values as empty strings.

net

现在,此软件包中的ConnListener实现可确保在Close返回时,基础文件描述符已关闭. (在较早的版本中,如果Close在其他goroutine中停止了挂起的I / O,则在Close返回后不久,其中一个goroutine中可能会关闭文件描述符.)

TCPListenerUnixListener现在实现syscall.Conn ,以允许使用syscall.RawConn.Control在基础文件描述符上设置选项.

Pipe返回的Conn实现现在支持设置读写期限.

现在,在Windows上实现了IPConn.ReadMsgIPIPConn.WriteMsgIPUDPConn.ReadMsgUDPUDPConn.WriteMsgUDP方法.

net/http

在客户端,现在可以将HTTP代理(最通常由ProxyFromEnvironment配置)指定为https:// URL,这意味着客户端在发出标准的代理HTTP请求之前通过HTTPS连接到代理. (以前,HTTP代理URL必须以http://socks5://开头.)

在服务器端, FileServer及其等效的单文件ServeFile现在将If-Range检查应用于HEAD请求. FileServer现在还向ServerErrorLog报告目录读取失败. 现在,在提供零长度内容时, Content-Type提供处理程序也将省略Content-Type标头.

现在,如果传递了无效的(非3位数)状态代码,则ResponseWriterWriteHeader方法会出现错误.

Handler不写入任何输出时, Server将不再添加隐式Content-Type.

现在, Redirect在写HTTP响应之前设置Content-Type头.

net/mail

ParseAddressParseAddressList现在支持各种过时的地址格式.

net/smtp

Client添加了新的Noop方法,以测试服务器是否仍在响应. 现在,它还可防止HelloVerify方法的输入中可能的SMTP注入.

net/textproto

ReadMIMEHeader现在拒绝任何以连续(缩进)标题行开头的标题. 以前,具有缩进的第一行的标头被视为未缩进第一行.

net/url

现在, ResolveReference在目标URL中保留多个斜杠. 以前,它将多个前导斜杠重写为一个斜杠,这导致http.Client遵循某些重定向错误.

例如,此代码的输出已更改:

base, _ := url.Parse("http://host//path//to/page1")
target, _ := url.Parse("page2")
fmt.Println(base.ResolveReference(target))

Note the doubled slashes around path. In Go 1.9 and earlier, the resolved URL was http://host/path//to/page2: the doubled slash before path was incorrectly rewritten to a single slash, while the doubled slash after path was correctly preserved. Go 1.10 preserves both doubled slashes, resolving to http://host//path//to/page2 as required by RFC 3986.

此更改可能会破坏现有的错误程序,这些错误程序无意中构造了路径中带有前导双斜杠的基本URL,并且无意中依赖ResolveReference来纠正该错误. 例如,如果代码将主机前缀(例如http://host/到路径(例如/my/api ,从而导致URL带有双斜杠: http://host//my/api ,则会发生这种情况.

UserInfo的方法现在将nil接收器视为指向零UserInfo的指针. 以前,他们惊慌失措.

os

File添加了新方法SetDeadlineSetReadDeadlineSetWriteDeadline ,这些方法允许在基础文件描述符支持非阻塞I / O操作时设置I / O截止日期. 这些方法的定义与net.Conn的定义匹配. 如果一个I / O方法由于缺少最后期限而失败,它将返回一个超时错误. 新的IsTimeout函数报告错误是否表示超时.

现在还匹配net.ConnFileClose方法可确保在Close返回时,基础文件描述符已关闭. (在较早的版本中,如果Close在其他goroutine中停止了挂起的I / O,则在Close返回后不久,其中一个goroutine中可能会关闭文件描述符.)

在BSD,macOS和Solaris系统上, Chtimes现在支持以纳秒级精度设置文件时间(假设底层文件系统可以表示它们).

reflect

Copy功能现在允许从字符串复制到字节数组或字节片中,以匹配内置复制功能 .

在结构中,以前未正确报告指向未导出结构类型的嵌入式指针,并在相应的StructField中使用空的PkgPath来报告,结果对于这些字段, Value.CanSet错误地返回true,而Value.Set错误地成功. 基础元数据已更正; 对于这些字段, CanSet现在可以正确返回false,而Set Now现在可以正确恐慌. 这可能会影响基于反射的解组器,这些解组器以前可以解组到此类字段中,但现在不再可以. 例如,请参阅encoding/json注释 .

runtime/pprof

如上所述 ,阻塞和互斥配置文件现在包括符号信息,因此可以查看它们而无需生成它们的二进制文件.

strconv

现在, ParseUint返回具有任何ErrRange错误的适当大小的最大量级整数,正如已经记录的那样. 以前,它返回0并显示ErrRange错误.

strings

一种新的Builder类型可以替代bytes.Buffer用于将文本累积为string结果的用例. Builder的API是bytes.Buffer的受限制子集,它可以安全地避免在String方法期间复制数据.

syscall

在Windows上,新的SysProcAttr字段Token (类型为Token允许创建一个在StartProcess期间(因此也在os.StartProcessexec.Cmd.Start期间)以另一个用户身份运行的进程. 新功能CreateProcessAsUser允许访问基础系统调用.

在BSD,macOS和Solaris系统上,现已实现UtimesNano .

time

现在, LoadLocation使用$ZONEINFO环境变量命名的目录或未压缩的zip文件,然后在默认的系统特定的已知安装位置列表或$GOROOT/lib/time/zoneinfo.zip .

新功能LoadLocationFromTZData允许将IANA时区文件数据转换为Location .

unicode

整个系统中的unicode包和相关支持已从Unicode 9.0升级到Unicode 10.0 ,从而增加了8,518个新字符,包括四个新脚本,一个新属性,一个比特币货币符号和56个新表情符号.

by  ICOPY.SITE