go mod 能指定 1.xx.x 版本么?
這是一個(gè)小知識(shí)點(diǎn),不過估計(jì)不是每個(gè)人都知道。
一個(gè)讀者在群里問到,我想要把 go.mod 中指定 go 版本的go 1.17?修改為go 1.17.1,希望我的項(xiàng)目最低要求 1.17.1。但是 Goland 老是把版本號(hào)修改回?go 1.17?是不是我哪里設(shè)置有問題?
其實(shí)這里不是設(shè)置有問題,而是 go.mod 要求就是如此。
指定 go 版本的地方叫 go directive 。它的格式是:
GoDirective = "go" GoVersion newline .
GoVersion = string | ident . /* valid release version; see above */
其中所謂的 valid release version 為必須是像 1.17 這樣,前面是一個(gè)點(diǎn),前面是正整數(shù)(其實(shí)現(xiàn)在也只能是 1),后面是非負(fù)整數(shù)。
The version must be a valid Go release version: a positive integer followed by a dot and a non-negative integer (for example, 1.9, 1.14).
go 的版本形如 1.2.3-pre。一般最多由兩個(gè)點(diǎn)組成,其中 1 叫做 major version,主版本,非常大的改動(dòng)的時(shí)候才會(huì)升級(jí)這個(gè)版本。而 2 叫做 minor version,表示有一些接口級(jí)別的增加,但是會(huì)保證向后兼容,才會(huì)升級(jí)這個(gè)版本。而 3 叫做 patch version。顧名思義,一些不影響接口,但是打了一些補(bǔ)丁和修復(fù)的版本。而最后的 pre 叫做 pre-release suffix。我理解和 beta 版本一樣的概念,在 release 版本出現(xiàn)之前,預(yù)先投放在市場(chǎng)的試用版本。
所以 go mod 中的格式只能允許 major version 和 minor version。它認(rèn)為,使用者關(guān)注這兩個(gè)版本號(hào)就行,他們能保證使用者在使用 golang 標(biāo)準(zhǔn)庫的時(shí)候源碼接口并沒有增加和修改,不管你使用什么 patch version,你的業(yè)務(wù)代碼都能跑起來。
所以,結(jié)論是,goland 非常智能。

推薦閱讀
