golangci/golangci-lint · error

invalid Go runtime version: %s

Error message

invalid Go runtime version: %s

What it means

cleanRuntimeVersion parses the output of `go version` looking for a token starting with "go1." (e.g. "go1.22.1" or a devel build like "go1.24-e705a2d"). If no such token is found in any part of the version string, it gives up with this error. The library throws it because it cannot map the installed Go toolchain to a parseable version.

Source

Thrown at pkg/goutil/version.go:72

	return v
}

func CleanRuntimeVersion() (string, error) {
	return cleanRuntimeVersion(runtime.Version())
}

func cleanRuntimeVersion(rv string) (string, error) {
	for part := range strings.FieldsSeq(rv) {
		// Allow to handle:
		// - GOEXPERIMENT -> "go1.23.0 X:boringcrypto"
		// - devel -> "devel go1.24-e705a2d Wed Aug 7 01:16:42 2024 +0000 linux/amd64"
		if strings.HasPrefix(part, "go1.") {
			return part, nil
		}
	}

	return "", fmt.Errorf("invalid Go runtime version: %s", rv)
}

View on GitHub (pinned to ed7a235d2d)

Solutions

  1. Run `go version` manually and confirm the output contains a token like "go1.22"; fix the PATH or reinstall Go if not.
  2. If using a devel/gotip toolchain, switch to a stable release (golang.org/dl/go1.22.x) whose version string is supported.
  3. For gccgo or alternative toolchains, install the official gc-based Go toolchain.
  4. If passing a version string programmatically to CleanRuntimeVersion, normalize it first so it includes the "go1." token.

Example fix

// before (nonstandard toolchain output)
go version
# gccgo (GCC) 12.0

// after (official toolchain)
$ PATH=/usr/local/go/bin:$PATH go version
# go version go1.22.5 linux/amd64
Defensive patterns

Strategy: validation

Validate before calling

rv, err := exec.Command("go", "version").Output()
if err != nil { return err }
if !strings.Contains(string(rv), "go1.") {
    return fmt.Errorf("unsupported go version output: %q", rv)
}
// safe to proceed with CleanRuntimeVersion

Type guard

func isParseableGoVersion(rv string) bool {
    for _, part := range strings.Fields(rv) {
        if strings.HasPrefix(part, "go1.") { return true }
    }
    return false
}

Try / catch

v, err := goutil.CleanRuntimeVersion(raw)
if err != nil {
    var verr = err // inspect strings.Contains(err.Error(), "invalid Go runtime version")
    log.Warnf("go version unparsable, skipping version checks: %v", verr)
    return nil
}

Prevention

When it happens

Trigger: Calling CleanRuntimeVersion (or the anonymous helper via ParseGoVersion) with a raw version string that contains no "go1." token, e.g. empty output, `go version` from a non-Go toolchain, or a hand-crafted string like "devel +abc123" without the go1 prefix.

Common situations: Custom or misinstalled Go toolchains (gotip builds whose output changed format), third-party compilers (gccgo reporting "gccgo (GCC) 12.0"), corrupted PATH where `go` resolves to a wrapper script, or CI images where the go binary is a shim emitting unexpected text.

Related errors


AI-assisted analysis of golangci/golangci-lint@ed7a235d2d (2026-09-02). Data as JSON: /api/errors/02b8ae6009717c03. Report an issue: GitHub.