我想确保人们在编译我的应用程序时没有使用Go 1.12或更早的版本;主要是因为:
return fmt.Errorf("foo: %w", err)
将在Go 1.12中编译得很好,但实际上不会像预期的那样运行,因为它需要在Go 1.13或更高版本中进行运行时更改才能获得该%w
。
即使有一些改变引入了编译错误,比如二进制文字或数字文字中的_
,一个更好的“你需要Go 1.13或更高版本”的-message会更好,更少令人困惑,因为不是每个人都熟悉Go并知道如何处理语法错误(似乎有些人仍然使用相当旧的Go版本)。
我将go 1.13
添加到我的go.mod
文件中,但我仍然可以在旧版本中很好地编译它(添加go 1.16
并使用Go 1.15编译也可以)。
有没有办法在编译应用程序时要求最低Go版本,以防止运行时错误并显示友好的错误消息?
发布于 2020-12-04 10:51:32
我能想到的最简单的方法是用+build !go1.13
添加一个新文件;因为所有新版本都添加了Go版本的构建标签(Go 1.14有go1.14
、go1.13
、go1.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
https://stackoverflow.com/questions/65137235
复制相似问题