golang1.16新特性速览(推荐)

golang1.16也在今天正式发布了。

原定计划是2月1号年前发布的,不过迟到也是golang的老传统了,正好也趁着最后的假期快速预览一下golang1.16的新特性吧。

语言內建的资源嵌入支持

之前市面上已经有很多把今天文件嵌入golang二进制程序的工具了,这次golang官方将这一功能加入了embed标准库,从语言层面上提供了支持。

我之前以及写了embed的使用教程,可以看这里

这儿还有一篇官方推荐的教程

支持arm64

m1芯片可谓是最近的焦点,golang自然也不会落下。

在golang1.16中官方已经支持darwin/arm64平台,cgo和编译成c语言可调用的动态/静态链接库的功能也已支持。同样受益的还有bsd家族的arm64版本。

现在可以在新版mac上尝试golang了。

不过plugin模式的支持仍在进行中,想要完整支持arm64还需要一段时间。

go modules的新特性

本次更新依旧带来了许多modules的新特性。

GO111MODULE现在默认为on

1.16开始默认启用modules,这在1.15的时候已经预告过了。现在GO111MODULE的默认值为on。

不过golang还是提供了一个版本的适应期,如果你还不习惯modules,可以把GO111MODULE设置回auto。在1.17中这个环境变量将会被删除。

都1202年了,也该学学go modules怎么用了。

go build不再更改mod相关文件

以前的教程里我提到过go build会自动下载依赖,这会更新mod文件。

现在这一行为被禁止了。想要安装、更新依赖只能使用go get命令,go build和go test将不会再做这类工作。

go install的变化

go install在1.16中也有了不小的变化。

首先是通过go install my.module/tool@1.0.0 这样在module末尾加上版本号,可以在不影响当前mod的依赖的情况下安装golang程序。

go install是未来唯一可以安装golang程序的命令,go get的编译安装功能现在可以靠-d选项关闭,而未来编译安装功能会从go get移除。

也就是说go的命令各司其职,不再长臂管辖了。

新的GOVCS环境变量

新的GOVCS环境变量指定了golang用什么版本控制工具下载源代码。

其格式为:GOVCS=<module prefix>:<tool name>,[<module prefix>:<tool name>, ...]

其中module prefix为github.com等,而tool name就是版本控制工具的名字,比如git,svn。

一个更具体的例子是:GOVCS=github.com:git,evil.com:off,*:git|hg

module prefix也可以用*通配任何模块的前缀。

tool name还可以设置为all和off,all代表允许使用任何可用的工具,而off则表示不允许使用任何版本控制工具。

不过现在设置为off的模块的代码仍然可能会被下载。

更多的细节可以参考go help vcs

相对路径导入不在被允许

golang1.16开始禁止import导入的模块以.开头,模块路径中也不允许出现任何非ASCII字符,所以下面的代码不再合法:

import (
 "./tools/factory"
 "../models/user"
 "some.pkg.com/杀马特/音乐工厂"
)

对非ASCII字符一如既往的不友好,不过也只能按规矩办事了。

标准库的变化

golang1.16除了对标准库进行通常的功能更新和修复,还引入了一些重大变化。

testing

testing包主要的变化是在测试用例里调用os.Exit(0)会从程序终止变成测试失败。

比如这个:

package main

import (
 "os"
 "testing"
)

func TestXXX(t *testing.T) {
 t.Log("exit")
 os.Exit(0)
}

现在会是这样的输出:

$ go test -v a_test.go

=== RUN TestXXX
 a_test.go:9: exit
--- FAIL: TestXXX (0.00s)
panic: unexpected call to os.Exit(0) during test [recovered]
  panic: unexpected call to os.Exit(0) during test

goroutine 18 [running]:
testing.tRunner.func1.2(0x51b920, 0x56cc28)
  /usr/local/go/src/testing/testing.go:1144 +0x332
testing.tRunner.func1(0xc000082600)
  /usr/local/go/src/testing/testing.go:1147 +0x4b6
panic(0x51b920, 0x56cc28)
  /usr/local/go/src/runtime/panic.go:965 +0x1b9
os.Exit(0x0)
  /usr/local/go/src/os/proc.go:68 +0x6d
command-line-arguments.TestXXX(0xc000082600)
  /tmp/a_test.go:10 +0x76
testing.tRunner(0xc000082600, 0x54df18)
  /usr/local/go/src/testing/testing.go:1194 +0xef
created by testing.(*T).Run
  /usr/local/go/src/testing/testing.go:1239 +0x2b3
FAIL command-line-arguments 0.004s
FAIL

ioutils包已经废弃

1.16已经标记io/ioutil为废弃,函数被转移到了os和io这两个包里,具体见下表:

ioutil旧函数 新函数
Discard io.Discard
NopCloser io.NopCloser
ReadAll io.ReadAll
ReadDir os.ReadDir
ReadFile os.ReadFile
WriteFile os.WriteFile
TempDir os.MkdirTemp
TempFile os.CreateTemp

现在开始可以做移植了。

tcp半连接队列扩容

在Linux kernel 4.1以前,golang设置tcp的listen队列的长度是从/proc/sys/net/core/somaxconn获取的,通常为4096。

而在4.1以后golang会直接设置半连接队列的长度为2^32 - 1也就是4294967295。

更大的半连接队列意味着可以同时处理更多的新加入请求,而且不用再读取配置文件性能也会略微提升。

重大更新io/fs

1.16除了支持嵌入静态资源外,最大的变化就是引入了io/fs包。

golang认为文件的io操作是依赖于文件系统(filesystem,fs)的,所以决定模仿Linux的vfs做一套基于fs的io接口。

这样做的目的有三个:

  1. os包应该专注于和系统交互而不是包含一部分io接口
  2. io包和os包分别包含了io接口的一部分,导致互相依赖职责不清晰
  3. 可以把有关联的一部分文件或者数据组成虚拟文件系统,供通用接口处理提升程序的可扩展性,比如zip打包的文件

所以io/fs诞生了。

fs包中主要包含了下面几种数据类型(都是接口类型):

名称 作用
FS 文件系统的抽象,有一个Open方法用来从FS打开获取文件数据
DirEntry 描述目录项目(包含目录自身)的数据结构
File 描述文件数据的结构,包含Stat,Read,Close方法
ReadDirFile 在File的基础上支持ReadDir,可以代表目录自身
FileMode 描述文件类型,比如是通常文件还是套接字或者是管道
FileInfo 文件的元数据,例如创建时间等

其中有一些接口和os包中的同名,实际上是os包引入fs包后起的别名。

对于FS,还有以下的扩展,以便增量描述文件系统允许的操作:

名称 作用
GlobFS 增加Glob方法,可以用通配符查找文件
ReadDirFS 增加ReadDir方法,可以遍历目录
ReadFileFS 增加ReadFile方法,可以用文件名读取文件所有内容
StatFS 增加Stat方法,可以获得文件/目录的元信息
SubFS 增加Sub方法,Sub方法接受一个文件/目录的名字,从这个名字作为根目录返回一个新的文件系统对象

fs包还提供了诸如Glob,WalkDir等传统的文件操作接口。

fs的主要威力在于处理zip、tar文件,以及http的文件接口时可以大幅简化代码。而且新的embed静态资源嵌入也是依赖fs实现的。

因为只是速览的缘故,无法详尽介绍io/fs包,你可以参考golang的文档或这篇文章做进一步了解。

其他改进

其他的改进包括Unicode更新到了13.0、新增加了runtime/metrics包已提供更好更规范的运行时信息等。

同时1.16优化了链接器,现在它在linux/amd64上比1.15快了20-25%,内存占用减少了5-15%。

在Windows上已经全面支持了地址空间布局随机化(ASLR),此前不支持将golang编译为dll时启用ASLR。

本次更新中语言本身没有什么变化。

更多信息可以查看golang1.16 release notes

到此这篇关于golang1.16新特性速览的文章就介绍到这了,更多相关golang1.16新特性速览内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang中defer的关键特性示例详解

    前言 大家都知道golang的defer关键字,它可以在函数返回前执行一些操作,最常用的就是打开一个资源(例如一个文件.数据库连接等)时就用defer延迟关闭改资源,以免引起内存泄漏.本文主要给大家介绍了关于golang中defer的关键特性,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 一.defer 的作用和执行时机 go 的 defer 语句是用来延迟执行函数的,而且延迟发生在调用函数 return 之后,比如 func a() int { defer b() return

  • golang1.16新特性速览(推荐)

    golang1.16也在今天正式发布了. 原定计划是2月1号年前发布的,不过迟到也是golang的老传统了,正好也趁着最后的假期快速预览一下golang1.16的新特性吧. 语言內建的资源嵌入支持 之前市面上已经有很多把今天文件嵌入golang二进制程序的工具了,这次golang官方将这一功能加入了embed标准库,从语言层面上提供了支持. 我之前以及写了embed的使用教程,可以看这里. 这儿还有一篇官方推荐的教程. 支持arm64 m1芯片可谓是最近的焦点,golang自然也不会落下. 在g

  • Go1.16新特性embed打包静态资源文件实现

    目录 背景 embed 嵌入 字符串.字节切片.文件嵌入 嵌入文件 嵌入文件夹 嵌入匹配 FS 文件系统 总结: 背景 相信有一部分人喜爱 GO 的初衷大概是:跨平台静态编译,如果在没用通过 CGO 引用其他库的话,一般编译出来的可执行二进制文件部署起来非常方便,但人们在实际中发现,使用 Go 语言开发的后端 WEB 程序存在 HTML 模版.图片.JS.CSS.JSON 等静态资源,部署时需要把这些静态资源与二进制程序一起上传到服务器部署,在现今遍地花容器的今天,为了简化部署流程,能不能更进一

  • PostgreSQL 16 新特性之正态分布随机数函数的示例

    random() 函数可以用于生成一个大于等于 0 小于等于 1 的随机数,生成的数据遵循平均分布.不过在实际环境中,更多的数据则是遵循正态分布.PostgreSQL 提供了一个扩展模块tablefunc,可以用于生成遵循正态分布的随机数:或者我们也可以创建存储函数来模拟正态分布的随机数. 考虑到它的实用性,PostgreSQL 16 新增了一个内置的 random_normal() 函数,用于生成这种随机数.我们使用该函数生成 10 个随机数: select random_normal() a

  • C#11新特性预览及使用介绍

    目录 C# 11 预览:允许在内插字符串的“插值表达式”中换行 C# 11 预览:列表模式 C# 11 预览:新的参数空值检查 如何尝试预览特性 .NET 首席项目经理凯瑟琳在博客中介绍了 C# 11 的一些预览性新功能,这些功能可以在 Visual Studio 17.1 和 .NET SDK 6.0.200 中体验,下面摘录一部分新特性作介绍: C# 11 预览:允许在内插字符串的“插值表达式”中换行 内插字符串(interpolated strings)是 C# 6.0 引入的语法,它允许

  • Python3.6正式版新特性预览

    按照Python官网上的计划,Python3.6正式版期望在2016-12-16号发布,也就是这周五.从去年的5月份开始,Python3.6版本就已经动手开发了,期间也断断续续的发布了4个Alpha版,4个Beta版,以及一个Candidate版本. 作为一个Python爱好者,很期待新版本的发布,也希望能第一时间尝试一下新特性.本文就根据Python官网文章What's New In Python 3.6,简单介绍下Python3.6中的一些新特性. 如果你想尝试Python3.6,又不想破坏

  • Swift 4最全的新特性详细解析(推荐)

    引言 Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序.Swift吸收了众多现代编程语言的优点,尽力的提供简洁的编程语言和强大的功能. WWDC 2017 给大家带来了很多惊喜.Swift 4 也伴随着 Xcode 9 测试版来到了我们的面前,很多强大的新特性非常值得我们期待在正式项目中去使用它.因为 Swift 4 是开源的,如果你关注 swift-evolution 这个项目的

  • PHP6 中可能会出现的新特性预览

    这些特性包括: 集成OpCache(OPcache通过对PHP的opcode进行缓存和优化,可以提高PHP程序的执行速度)    改善对64位环境的支持    支持Unicode    清理内部API    提升代码质量,做到Warning-Free    改善OPcodes.编译器.运行时    JIT编译器(LibJIT?)    支持Annotation(注解?)    命名自变量(Named argument)    不同等级的类型提示    支持HTTP 2.0协议(可能会使用nght

  • 浅谈php7的重大新特性

    截止到目前为止,PHP官方已经发布了php7的RC5版本,预计在11月份左右会发布第一个正式版本!现在来说php7的重大特性肯定已经是定型了,不会再有什么变动了.后续一些版本的迭代主要也就是修修bug,优化之类的.下面就来说话我们一直期待的php7会有那些主要的变化了... 新特性预览 ZEND引擎升级到Zend Engine 3,也就是所谓的PHP NG 增加抽象语法树,使编译更加科学 64位的INT支持 统一的变量语法 原声的TLS - 对扩展开发有意义 一致性foreach循环的改进 新增

  • c# 9.0新特性nint和Pattern matching的使用方法

    一:背景 1. 讲故事 上一篇跟大家聊到了Target-typed new 和 Lambda discard parameters,看博客园和公号里的阅读量都达到了新高,甚是欣慰,不管大家对新特性是多头还是空头,起码还是对它抱有一种极为关注的态度,所以我的这个系列还得跟,那就继续开撸吧,今天继续带来两个新特性,更多新特性列表,请大家关注:新特性预览 二:新特性研究 1. Native ints 从字面上看貌似是什么原生类型ints,有点莫名其妙,还是看一看Issues上举得例子吧: Summar

  • 神经网络API、Kotlin支持,那些你必须知道的Android 8.1预览版和Android Studio 3.0新特性

    谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快. 过去的五个月里, Kotlin一直是我们反复谈论的重点.现在要告诉大家的是,Android Studio 3.0可以将Kotlin添加到您的项目中了.最新版本的Android Studio在支持Java 8语言功能上得到了改进,另外一个亮点是,有了用于Gradle 3.0.0的Android插件. 好,下面步入正文. 曾仅用 55 秒发布会的 Android 8.0 Oreo 在时隔两个月

随机推荐