编译应用程序时,我可以要求最低Go版本吗



我想确保人们在编译我的应用程序时没有使用Go 1.12或更旧版本;主要是因为:

return fmt.Errorf("foo: %w", err)

将在Go 1.12中编译良好,但实际上不会像预期的那样运行,因为它需要在Go 1.13或更新版本中进行运行时更改才能使用%w

甚至还有引入编译错误的更改,例如二进制文字或数字文字中的_,这是一个更好的";你需要Go 1.13或更新版本"-这条消息会更好,也不会那么令人困惑,因为并不是每个人都熟悉Go,知道如何处理语法错误(似乎有些人仍然使用相当旧的Go版本(。

我将go 1.13添加到了我的go.mod文件中,但我仍然可以使用旧版本对其进行良好编译(添加go 1.16和使用Go 1.15进行编译也可以(。

在编译应用程序时,是否有任何方法要求最低Go版本,以防止运行时出错并显示友好的错误消息?

我能想到的最简单的方法是添加一个带有+build !go1.13的新文件;由于Go版本构建标记是为所有较新版本添加的(Go 1.14具有go1.14go1.13go1.12等(,因此它将仅为Go 1.13之前的版本编译,而对于任何较新版本都将被忽略:

// +build !go1.13
package main
func init() {
"You need Go 1.13 or newer to compile this program"
}

这引入了一个故意的编译错误,导致了一个相当不错的错误消息:

$ go install ./cmd/app
# zgo.at/app/cmd/app
cmd/app/old.go:8:2: "You need Go 1.13 or newer to compile this program" evaluated but not used

最新更新