中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang1.16的特性有哪些

發布時間:2021-02-18 14:08:05 來源:億速云 閱讀:237 作者:Leah 欄目:開發技術

golang1.16的特性有哪些?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

支持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舊函數新函數
Discardio.Discard
NopCloserio.NopCloser
ReadAllio.ReadAll
ReadDiros.ReadDir
ReadFileos.ReadFile
WriteFileos.WriteFile
TempDiros.MkdirTemp
TempFileos.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的特性有哪些問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

电白县| 宝清县| 太湖县| 莆田市| 西平县| 宣威市| 涟源市| 五常市| 永川市| 克东县| 分宜县| 洛隆县| 奉贤区| 象山县| 红安县| 湛江市| 府谷县| 和政县| 乌兰县| 南涧| 玛纳斯县| 清徐县| 新闻| 普洱| 镇沅| 儋州市| 南漳县| 蒙阴县| 南召县| 衢州市| 保亭| 合江县| 永嘉县| 福贡县| 裕民县| 志丹县| 乐平市| 龙里县| 葫芦岛市| 华容县| 华亭县|