Golang 1.16新特性——看完血赚
共 5316字,需浏览 11分钟
·
2021-05-01 21:31
Golang 1.16今年重磅发布了,这一版本有哪些新特性呢?
本篇就带大家来捋一下~~
支持arm64
它支持最新Mac的M1芯片 。
在Golang1.16中,官方已经支持darwin/arm64平台,cgo和编译成C语言可调用的动态/静态链接库的功能也已支持。
同样,free bsd家族的arm64版本也可以使用Golang。(PS:再也不用担心M1电脑不能写代码了)
把静态文件嵌入Golang二进制程序的工具了,Golang将这一功能加入了embed标准库,从语言层面上提供了支持。
(module [ˈmɑːdʒuːl] 组件)
GO111MODULE现在默认为on,如果还不习惯使用modules,应该学一下了。
go build的变化
以前使用go build命令会自动下载依赖,这会更新mod文件。
现在这一行为被禁止了。想要安装、更新依赖只能使用go get命令,go build和go test将不会再下载依赖。
通过go install xx.module/tool@1.0.0 在module末尾加上版本号,可以在不影响当前mod的依赖的情况下安装golang程序。
新的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的模块的代码仍然可能会被下载。
Golang1.16开始禁止import导入的模块以.开头,模块路径中也不允许出现任何非ASCII字符,所以下面的代码不再合法:
import (
"./happy"
"../models/product"
"xx.pkg.com/面向加薪学习"
)
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
在Linux kernel 4.1以前,Golang设置tcp的listen队列的长度是从/proc/sys/net/core/somaxconn获取的,通常为4096。
而在4.1以后golang会直接设置半连接队列的长度为2^32 - 1也就是4294967295。更大的半连接队列意味着可以同时处理更多的新加入请求,而且不用再读取配置文件性能也会略微提升。
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的授权协议等。通过实战,把前面讲解的知识点运用起来,帮助读者快速上手,积累项目经验。
(扫码了解本书详情)
如果喜欢本文 欢迎 在看丨留言丨分享至朋友圈 三连
热文推荐
▼点击阅读原文,获取本书详情~