go mod 能指定 1.xx.x 版本么?
這是一個小知識點(diǎn),不過估計不是每個人都知道。
一個讀者在群里問到,我想要把 go.mod 中指定 go 版本的go 1.17?修改為go 1.17.1,希望我的項(xiàng)目最低要求 1.17.1。但是 Goland 老是把版本號修改回?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 這樣,前面是一個點(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。一般最多由兩個點(diǎn)組成,其中 1 叫做 major version,主版本,非常大的改動的時候才會升級這個版本。而 2 叫做 minor version,表示有一些接口級別的增加,但是會保證向后兼容,才會升級這個版本。而 3 叫做 patch version。顧名思義,一些不影響接口,但是打了一些補(bǔ)丁和修復(fù)的版本。而最后的 pre 叫做 pre-release suffix。我理解和 beta 版本一樣的概念,在 release 版本出現(xiàn)之前,預(yù)先投放在市場的試用版本。
所以 go mod 中的格式只能允許 major version 和 minor version。它認(rèn)為,使用者關(guān)注這兩個版本號就行,他們能保證使用者在使用 golang 標(biāo)準(zhǔn)庫的時候源碼接口并沒有增加和修改,不管你使用什么 patch version,你的業(yè)務(wù)代碼都能跑起來。
所以,結(jié)論是,goland 非常智能。

推薦閱讀
