Golang 1.16新特性——看完血赚

博文视点Broadview

共 5316字,需浏览 11分钟

 ·

2021-05-01 21:31

Golang 1.16今年重磅发布了,这一版本有哪些新特性呢?

本篇就带大家来捋一下~~



1

支持arm64



它支持最新Mac的M1芯片 。


在Golang1.16中,官方已经支持darwin/arm64平台,cgo和编译成C语言可调用的动态/静态链接库的功能也已支持。

同样,free bsd家族的arm64版本也可以使用Golang。(PS:再也不用担心M1电脑不能写代码了



2

內嵌资源文件


把静态文件嵌入Golang二进制程序的工具了,Golang将这一功能加入了embed标准库,从语言层面上提供了支持。 



3

Go modules的新特性

 (modulemɑːdʒuːl] 组件)

 GO111MODULE现在默认为on,如果还不习惯使用modules,应该学一下了。 



4

go build的变化


 以前使用go build命令会自动下载依赖,这会更新mod文件。 

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



5

go install的变化


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




6

新的GOVCS环境变量


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


其格式为:

GOVCS=<module prefix>:<tool name>,[<module prefix>:<tool name>, ...] 

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


一个更具体的例子是:

GOVCS=github.com:git,xx.com:off,*:git|hg 

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

tool name还可以设置为all和off,all代表允许使用任何可用的工具,而off则表示不允许使用任何版本控制工具。不过现在设置为off的模块的代码仍然可能会被下载。 



7

相对路径导入不再被允许



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

import ( 
"./happy"
"../models/product"
"xx.pkg.com/面向加薪学习"
)





8

标准库的变化


Golang1.16已经标记io/ioutil为废弃,函数被转移到了os和io这两个包里:


Discard           io.Discard 
NopCloser io.NopCloser
ReadAll io.ReadAll
ReadDir os.ReadDir
ReadFile os.ReadFile
WriteFile os.WriteFile
TempDir os.MkdirTemp
TempFile os.CreateTemp




9

tcp半连接队列扩容



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

而在4.1以后golang会直接设置半连接队列的长度为2^32 - 1也就是4294967295。更大的半连接队列意味着可以同时处理更多的新加入请求,而且不用再读取配置文件性能也会略微提升。



10

重大更新io/fs



 Golang1.16最大的变化就是引入了io/fs包。 

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

这样做有3个目的: 

  • os包应该专注于和系统交互而不是包含一部分io接口;

  • io包和os包分别包含了io接口的一部分,导致互相依赖职责不清晰;

  • 可以把有关联的一部分文件或者数据组成虚拟文件系统,给通用接口处理提升程序 的可扩展性,比如zip打包的文件。


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实现的。 


欢迎关注作者新书



▊《Go语言极简一本通:零基础入门到项目实战

欢喜 编著


  • 一本就通,一学就会!

本书是一本Go语言入门书,全书共分为三部分。第一部分讲解Go语言基础知识,包括变量与简单类型、数组、切片、流程控制、字典、函数、结构体与方法、接口等,可以帮助读者快速掌握Go语言的基本程序结构。第二部分讲解Go语言高效并发相关知识,包括协程与通道、并发资源、包管理和测试等,让读者对Go语言层面的并发支持有更深入的理解。第三部分讲解Go语言项目实战,包括Gin框架、生活点评项目实战、账户管理系统实战,以及OAuth 2.0的授权协议等。通过实战,把前面讲解的知识点运用起来,帮助读者快速上手,积累项目经验。

(扫码了解本书详情)



    


如果喜欢本文
欢迎 在看留言分享至朋友圈 三连


 热文推荐  





▼点击阅读原文,获取本书详情~
浏览 5
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报