Go1.17 快報(bào):將移除 GOPATH
閱讀本文大概需要 3 分鐘。
大家好,我是站長(zhǎng) polarisxu。
是的,沒(méi)看錯(cuò),Go 1.16 剛正式發(fā)布,但這里說(shuō)的是 Go1.17 將會(huì)包含的改變(不出意外的話),我會(huì)出一系列文章介紹 Go1.17 的變化。(好吧,內(nèi)卷了,哈哈哈哈!)
關(guān)于 Go 1.16 的變化。Reddit 上有一張圖總結(jié)的挺好的:

相關(guān)的知識(shí)點(diǎn),我之前也寫(xiě)過(guò)很好幾篇文章,有興趣的可以看看:
Go 1.16 的這個(gè)新變化需要適應(yīng)下:go get 和 go install 的變化 提前試用將在 Go1.16 中發(fā)布的內(nèi)嵌靜態(tài)資源功能 基于 Go1.16 實(shí)現(xiàn)靜態(tài)文件的 HTTP Cache 圖書(shū)《Go 語(yǔ)言標(biāo)準(zhǔn)庫(kù)》更新了:io/fs 包講解
剛剛 Go 官方發(fā)表博文[1],針對(duì) Go1.16 中 “Modules on by default” 進(jìn)行了詳細(xì)講解。默認(rèn)啟用 Module 是什么意思?也就是說(shuō) GO111MODULE=on,進(jìn)一步,即使沒(méi)有 go.mod ,go 命令現(xiàn)在仍以模塊感知模式(module-aware mode)構(gòu)建包。
盡管如此,你至少還可以手動(dòng)禁用 Module,即設(shè)置 ?GO111MODULE=off。
但官方計(jì)劃在 Go1.17 中移除 ?GO111MODULE 這個(gè)環(huán)境變量,屆時(shí)將只能使用 Module 模式。Go 語(yǔ)言總是針對(duì)某個(gè)問(wèn)題的盡量只有一種解決方案,保持其簡(jiǎn)單的“本性”,我個(gè)人還是挺喜歡的。當(dāng)然我相信也會(huì)有人不喜歡。
這里給大家一些建議:
網(wǎng)上的文章,講解 Go 環(huán)境搭建的,如果不是基于 module,而是 GOPATH 的,直接忽略。GOPATH 的歷史,有興趣可以了解,但作為新手,入門時(shí)多半下載的最新版本 Go,這時(shí)如果看到文章還是 GOPATH 年代的,基本環(huán)境都搞不定,會(huì)很有受挫感。 目前市面上的圖書(shū),大部分都還是基于 GOPATH 的(注:我出版的 《Go 語(yǔ)言編程之旅》是基于 Module 的),這部分內(nèi)容,基本也可以略過(guò),畢竟 GOPATH 要進(jìn)博物館了。 如果還沒(méi)有遷移到支持 Module 的版本,這半年時(shí)間盡快遷移吧,畢竟現(xiàn)在的庫(kù)基本會(huì)基于 Module 構(gòu)建,Go 1.17 預(yù)計(jì) 2021 年 8 月發(fā)布,距離 Go 1.11 過(guò)去好幾個(gè)版本了,給了充足的過(guò)度時(shí)間。
此外,在 Go1.17 中關(guān)于 module 的特性還會(huì)有其他改進(jìn),比如支持 lazy module loading[2],這應(yīng)該會(huì)使模塊加載過(guò)程更快,更穩(wěn)定。對(duì) Go1.17 中其他設(shè)計(jì)模塊變化的部分,可以通過(guò) https://github.com/golang/go/labels/modules 查看。
對(duì)于 Go 做出廢棄 GOPATH 的決定,你怎么看?
參考資料
博文: https://docs.studygolang.com/blog/go116-module-changes
[2]lazy module loading: https://github.com/golang/go/issues/36460
歡迎關(guān)注我
