Golang 1-16 新特性——看完血賺
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 的新特性
(module \[ˈmɑː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 語言極簡一本通:零基礎入門到項目實戰》
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。