golang1 16新特性速覽 推薦

2021-10-19 12:34:12 字數 4777 閱讀 2581

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中這個環境變數將會被刪除。

都2023年了,也該學學go modules怎麼用了。

現在這一行為被禁止了。想要安裝、更新依賴只能使用go get命令,go build和go test將不會再做這類工作。

go install的變化

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

首先是通過go install my.module/[email protected] 這樣在module末尾加上版本號,可以在不影響當前mod的依賴的情況下安裝golang程式。

go install是未來唯一可以安裝golang程式的命令,go get的編譯安裝功能現在可以靠-d選項關閉,而未來編譯安裝功能會從go get移除。

也就是說go的命令各司其職,不再長臂管轄了。

其格式為:govcs=:,[:, ...]

其中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則表示不允許使用任何版本控制工具。

相對路徑匯入不在被允許

golang1.16開始禁止import匯入的模組以.開頭,模組路徑中也不允許出現任何非ascii字元,所以下面的**不再合法:12

345import (

"./tools/factory"

"../models/user"

"some.pkg.com/殺馬特/**工廠"

)對非ascii字元一如既往的不友好,不過也只能按規矩辦事了。

標準庫的變化

golang1.16除了對標準庫進行通常的功能更新和修復,還引入了一些重大變化。

testing

testing包主要的變化是在測試用例裡呼叫os.exit(0)會從程式終止變成測試失敗。

比如這個:12

3456

78910

11package main

import (

"os"

"testing"

)func test***(t *testing.t)

現在會是這樣的輸出:12

3456

78910

1112

1314

1516

1718

1920

2122

2324

25$ go test -v a_test.go

=== run test***

a_test.go:9: exit

--- fail: test*** (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.test***(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介面。

這樣做的目的有三個:

os包應該專注於和系統互動而不是包含一部分io介面

io包和os包分別包含了io介面的一部分,導致互相依賴職責不清晰

可以把有關聯的一部分檔案或者資料組成虛擬檔案系統,供通用介面處理提公升程式的可擴充套件性,比如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實現的。

其他改進

其他的改進包括unicode更新到了13.0、新增加了runtime/metrics包已提供更好更規範的執行時資訊等。

同時1.16優化了鏈結器,現在它在linux/amd64上比1.15快了20-25%,記憶體占用減少了5-15%。

在windows上已經全面支援了位址空間布局隨機化(aslr),此前不支援將golang編譯為dll時啟用aslr。

本次更新中語言本身沒有什麼變化。

golang 之 map 新玩法

筆者接觸 golang 也有兩年的時間了,最常用的以string為key map 型別無非就是 map string 基礎型別 int string float等 map string inte ce map string struct 這幾類,說來慚愧,以前抽象資料結構,在用多維 map 的時候都...

Zend Framework V1 5 中的新特性

流行的開源軟體 zend framework 剛剛實現了一些出色的增強。本文介紹 v1.5 中的新特性以及如何公升級對 gdata web 服務的增強支援,包括zend form zend layout和zend view,並且,改進的 ajax 支援可以幫助 php 開發人員輕鬆地構建先進的 we...

Servlet2 4以上的filter新特性

在servlet2.4以下的版本中 web元件forward 到另外乙個 web元件的時候是不執行filter.最近專案中既需要forward 的方式.又需要forward請求訪問filter.查閱了一下google.發現servlet2.4以上版本的可以配置filter的規則,如下 1,只有當re...