diff --git a/pkg/config/config.go b/pkg/config/config.go index 1dd064013a22..14c684d41081 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -1,8 +1,11 @@ package config import ( + "fmt" + "go/version" "os" "regexp" + "runtime" "strings" hcversion "github.com/hashicorp/go-version" @@ -108,3 +111,37 @@ func trimGoVersion(v string) string { return v } + +func getRuntimeGoVersion() string { + goVersion := runtime.Version() + + parts := strings.Fields(goVersion) + + if len(parts) == 0 { + return goVersion + } + + // When using GOEXPERIMENT, the version returned might look something like "go1.23.0 X:boringcrypto". + return parts[0] +} + +func checkGoVersion(goVersion string) error { + langVersion := version.Lang(getRuntimeGoVersion()) + + runtimeVersion, err := hcversion.NewVersion(strings.TrimPrefix(langVersion, "go")) + if err != nil { + return err + } + + targetedVersion, err := hcversion.NewVersion(trimGoVersion(goVersion)) + if err != nil { + return err + } + + if runtimeVersion.LessThan(targetedVersion) { + return fmt.Errorf("the Go language version (%s) used to build golangci-lint is lower than the targeted Go version (%s)", + langVersion, goVersion) + } + + return nil +} diff --git a/pkg/config/loader.go b/pkg/config/loader.go index 91984930d84d..05f324330ce5 100644 --- a/pkg/config/loader.go +++ b/pkg/config/loader.go @@ -74,6 +74,11 @@ func (l *Loader) Load(opts LoadOptions) error { l.handleGoVersion() + err = checkGoVersion(l.cfg.Run.Go) + if err != nil { + return err + } + err = l.handleEnableOnlyOption() if err != nil { return err