自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go1.20 那些事:PGO、編譯速度、錯(cuò)誤處理等新特性,你知道多少?

開發(fā) 前端
Go1.20 將會(huì)在沒有 C 工具鏈的系統(tǒng)上默認(rèn)禁用 CGO。這理論上是一個(gè)不兼容性設(shè)置,如果大家有需要,可以提前設(shè)置好 CGO_ENABLED 環(huán)境變量,以避免導(dǎo)致部分應(yīng)用程序出問題。

大家好,我是煎魚。

最近 Go1.20 在 2 月初已經(jīng)正式發(fā)布,來的挺早的,以往都是拖到月底的,我翻了好幾篇,發(fā)現(xiàn)最后還是做了不少功能取舍,被迫放了某些新特性(例如:arena 等)的鴿子!

懷疑 Go 團(tuán)隊(duì) 2 月份是有什么事要干,或者打算休假?又或是擔(dān)心裁員影響工作交接?

今天快速溫習(xí)與我們關(guān)聯(lián)性多些的新特性,看看升不升 1.20。

編譯速度提高

之前 Go1.18 正式發(fā)布了泛型,有歡喜也有憂。這雖然支持了泛型,但是在 Go1.18 起編譯速度相對 Go1.17 變慢了,會(huì)慢大概 15-18%,降速明顯。

圖片

泛型特性,把 Go 引以為豪的構(gòu)建速度都變慢了。怕不是以后構(gòu)建也可以沖咖啡喝了?

原本說在 Go1.19 修,鴿了。終于,當(dāng)前版本已經(jīng)修復(fù)了。

如下測試報(bào)告:

117.results118.results119.results            │            tip.results
│ sec/op │ sec/op vs base │ sec/op vs base │ sec/op vs base │
GoBuildKubelet 52.58 ± 0% 56.54 ± 1% +7.54% (p=0.000 n=10) 55.47 ± 1% +5.50% (p=0.000 n=10) 51.41 ± 1% -2.22% (p=0.000 n=10)
GoBuildIstioctl 47.78 ± 1% 51.44 ± 0% +7.65% (p=0.000 n=10) 50.89 ± 5% +6.50% (p=0.000 n=10) 46.05 ± 1% -3.62% (p=0.000 n=10)
GoBuildFrontend 19.03 ± 1% 20.55 ± 1% +7.99% (p=0.000 n=10) 20.04 ± 0% +5.33% (p=0.000 n=10) 18.22 ± 1% -4.27% (p=0.000 n=10)
geomean 36.29 39.10 +7.72% 38.39 +5.77% 35.07 -3.37%

最新的 Go1.20 基準(zhǔn)測試中,當(dāng)前版本和 Go1.17 的構(gòu)建速度保持一致。

另外還優(yōu)化了編譯器和垃圾收集器,減少了內(nèi)存開銷,將整體 CPU 性能提高了 2%。

Go1.21 將結(jié)束 MacOS、Windows 部分版本支持

Go1.20 的更新公告中也宣布了一個(gè)重大的更新結(jié)束通知,涉及 macOS 和 windows 操作系統(tǒng)。

圖片

分別如下:

  • Go1.20 是支持 macOS 10.13 High Sierra 或 10.14 Mojave 上運(yùn)行的最后一個(gè)版本。Go 1.21 將需要 macOS 10.15 Catalina 或更高版本。
  • Go1.20 是支持 Windows 7、8、Server 2008 和 Server 2012 的任何版本上運(yùn)行的最后一個(gè)版本。Go 1.21 將至少需要 Windows 10 或 Server 2016。

好家伙,看來我需要更新我的操作系統(tǒng)版本了,不然下個(gè)版本 Go 都不歡迎我 coding 了。

圖片

有需要的同學(xué)在下個(gè)版本前盡早做好升級(jí)。

Go 發(fā)行版瘦身

新版本起,Go 的 $GOROOT/pkg 目錄將不再存儲(chǔ)標(biāo)準(zhǔn)庫的預(yù)編譯包存檔,Go 發(fā)行版的將迎來一輪瘦身。

大小對比如下。

Go1.20:

圖片

Go1.19:

圖片

約比老版本縮減了 1/3,還是比較明顯的。

PGO 引入

在 Go1.20 起,Go 引入了 Profile-guided optimization (PGO),翻譯過來是使用配置文件引導(dǎo)的優(yōu)化,當(dāng)前為預(yù)覽版本。

PGO 是一門編譯器優(yōu)化技術(shù),能夠在不改業(yè)務(wù)代碼的情況下,給你的應(yīng)用程序帶來一定的性能提升。在 Go PGO 中將會(huì)依托 runtime/pprof 所生成的 profile 來完成。

圖片

結(jié)果上可以使得 Go tool(工具鏈)能根據(jù)運(yùn)行時(shí)信息執(zhí)行特定于應(yīng)用程序和工作負(fù)載的優(yōu)化。說明了就是想提高性能,不需要改業(yè)務(wù)代碼。

具體可以詳見:《PGO 是啥,咋就讓 Go 更快更猛了?》

支持封裝多個(gè)錯(cuò)誤

在原有 Go1.13 的 errors API 上進(jìn)行新增和修改,核心是支持一個(gè)錯(cuò)誤可以封裝多個(gè)錯(cuò)誤的特性。

新特性例子:

func main() {
err1 := errors.New("err1")
err2 := errors.New("err2")
err := errors.Join(err1, err2)
fmt.Println(err)
if errors.Is(err, err1) {
fmt.Println("err is err1")
}
if errors.Is(err, err2) {
fmt.Println("err is err2")
}
}

輸出結(jié)果:

err1
err2
err is err1
err is err2

具體可以詳見:《Go1.20 繼續(xù)小修小補(bǔ) errors 庫。。?!?/p>

新增 StringData, String, SliceData

Go 團(tuán)隊(duì)通過分析、搜索發(fā)現(xiàn) reflect.SliceHeader 和 reflect.StringHeader:

type StringHeader struct {
Data uintptr
Len int
}

在業(yè)內(nèi)經(jīng)常被濫用,使用不方便,很容易出現(xiàn)隱性問題。例如:Data 字段類型是 uintptr 不是 unsafe.Pointer。設(shè)什么都可以,靈活度過于高,非常容易搞出問題。

在 Go1.20 起,在 unsafe 標(biāo)準(zhǔn)庫新增了 3 個(gè)函數(shù)來替代前面這兩個(gè)類型的使用。希望能夠進(jìn)一步標(biāo)準(zhǔn)化,并提供額外的類型安全。

圖片

如下函數(shù)簽名:

  • func String(ptr *byte, len IntegerType) string:根據(jù)數(shù)據(jù)指針和字符長度構(gòu)造一個(gè)新的 string。
  • func StringData(str string) *byte:返回指向該 string 的字節(jié)數(shù)組的數(shù)據(jù)指針。
  • func SliceData(slice []ArbitraryType) *ArbitraryType:返回該 slice 的數(shù)據(jù)指針。

新版本的用法變成:

func StringToBytes(s string) []byte {
return unsafe.Slice(unsafe.StringData(s), len(s))
}

func BytesToString(b []byte) string {
return unsafe.String(&b[0], len(b))
}

以往常用的 reflect.SliceHeader 和 reflect.StringHeader 將會(huì)被標(biāo)注為被廢棄。

具體可以詳見:《別亂用了,用新的。Go SliceHeader 和 StringHeader 將會(huì)被廢棄!》

優(yōu)化時(shí)間比較和格式記憶

2006-01-02 15:04:05

有很多 Go 同學(xué)反饋老要記 2006-01-02 15:04:05,發(fā)現(xiàn)這個(gè)日期時(shí)間點(diǎn),使用的次數(shù)非常高頻:

排名

頻率


格式

1

75616

time.RFC3339

2

23954

time.RFC3339Nano

3

13312

"2006-01-02 15:04:05"

4

12332

"2006-01-02"

5

11940

time.RFC1123

使用頻率的數(shù)據(jù)有理有據(jù)。

Go1.20 加了以下常量,便于直接引用:

DateTime   = "2006-01-02 15:04:05"
DateOnly = "2006-01-02"
TimeOnly = "15:04:05"

Time.Compare

再者就是新增了時(shí)間比較的方法。

在現(xiàn)在的標(biāo)準(zhǔn)庫中,有 3 個(gè)方法來比較 time.Time 對象,分別是:Before()、Equal() 和 After(),作用上類似 <、== 和 >。但缺少 <= 和 >= 的等價(jià)物。

Go1.20 將會(huì)支持 Time.Compare,以此來達(dá)到類似的效果。作用是將 Time 對象 t 和 u 兩者進(jìn)行比較。

func (t Time) Compare(u Time) int

該方法返回如下幾種結(jié)果:

  • 如果 t 在 u 之前,則返回 -1。
  • 如果 t 在 u 之后,則返回 +1。
  • 如果它們相同,則返回 0。

具體可以詳見:《Go1.20 中兩個(gè)關(guān)于 Time 的更新,終于不用背 2006-01-02 15:04:05 了!》

禁用匿名接口循環(huán)導(dǎo)入

以前可以做匿名接口循環(huán)導(dǎo)入的騷操作。如下代碼:

type I interface {
m()
interface {
I
}
}

這段代碼,聲明了接口類型 I,然后又包含了 m(),又包含接口 I。這會(huì)是一個(gè) “永動(dòng)機(jī)”,永遠(yuǎn)都不會(huì)停止。在開源的 GitHub 中,也真實(shí)存在著。

Go1.20 起,編譯器將會(huì)默認(rèn)拒絕匿名接口循環(huán)導(dǎo)入。如果沒有用戶反饋受到了重大的影響或問題,將會(huì)計(jì)劃在 Go1.22 中正式的禁用和移除該項(xiàng)功能的支持。

具體可以詳見:《Go1.20 將禁止匿名接口循環(huán)導(dǎo)入!》

沒有 C工具鏈默認(rèn)禁用 CGO

Go1.20 將會(huì)在沒有 C 工具鏈的系統(tǒng)上默認(rèn)禁用 CGO。這理論上是一個(gè)不兼容性設(shè)置,如果大家有需要,可以提前設(shè)置好 CGO_ENABLED 環(huán)境變量,以避免導(dǎo)致部分應(yīng)用程序出問題。

支持切片到數(shù)組的轉(zhuǎn)換

Go1.20 起支持將切片轉(zhuǎn)換成數(shù)組。

如下代碼:

func main() {
v := []string{"煎", "魚", "進(jìn)", "腦", "子", "了"}
s := [6]string(v)
fmt.Println(s)
}

當(dāng)然,前提是切片和數(shù)字的長度和類型都要對的上。否則會(huì)出現(xiàn)如下報(bào)錯(cuò):

panic: runtime error: cannot convert slice with length 5 to array or pointer to array with length 6

goroutine 1 [running]:
main.main()
/tmp/sandbox1162344488/prog.go:9 +0x1d

Program exited.

總結(jié)

在本次 Go1.20 的更新中,比較有意思的是 PGO 的預(yù)覽版本,大家有機(jī)會(huì)可以體驗(yàn)下不改代碼就提高應(yīng)用性能的快感。而相關(guān)的更新有的是在償還技術(shù)債務(wù)。例如:編譯加速等。

原本關(guān)注度很高的 arean,之前在《打臉了兄弟們,Go1.20 arena 來了!》中我分享過。在 Go 團(tuán)隊(duì)在具體實(shí)現(xiàn)和分析后,發(fā)現(xiàn)現(xiàn)有的 API 存在嚴(yán)重的問題,暫時(shí)回滾迭代代碼了,因此放了鴿子。這塊我計(jì)劃后面再單獨(dú)分享。

尤其需要注意的,Go1.21 起將不再支持 macOS、windows 部分版本??赡芤恍┕镜臋C(jī)器,甚至自己的要提前升級(jí)了。

責(zé)任編輯:武曉燕 來源: 腦子進(jìn)煎魚了
相關(guān)推薦

2022-06-30 08:52:33

GoC++內(nèi)存模型

2023-08-09 08:53:50

GoWASI語義

2021-09-13 07:53:31

Go錯(cuò)誤處理

2014-11-17 10:05:12

Go語言

2021-04-29 09:02:44

語言Go 處理

2023-03-02 09:07:44

2023-02-26 22:47:45

Go管理內(nèi)存

2022-07-13 08:53:28

函數(shù)Go語言

2022-10-24 08:55:13

Go工具鏈開發(fā)者

2024-06-05 08:47:20

Go語言方式

2024-02-21 07:24:21

微服務(wù)單體架構(gòu)MVC

2015-06-19 13:54:49

2010-01-20 13:19:01

VB.NET錯(cuò)誤處理

2023-02-22 16:33:04

前端JavaScript

2010-08-09 13:20:36

Flex

2025-03-31 00:29:44

2022-09-05 08:55:15

Go2提案語法

2023-03-10 08:48:29

2024-10-06 13:49:30

2017-11-03 13:43:24

云計(jì)算Saas信息化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)