cmd/go: go env GOMOD should not download newer toolchain

It is not neccessary to download a newer toolchain to display the path
to GOMOD or GOWORK.

Fixes: #61455

Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest,gotip-windows-amd64-longtest
Change-Id: I0b031651ad9bfeb5565361ecaff6908640ccf9c8
Reviewed-on: https://go-review.googlesource.com/c/go/+/581275
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Matloob <matloob@golang.org>
diff --git a/src/cmd/go/internal/toolchain/select.go b/src/cmd/go/internal/toolchain/select.go
index 6181f7c..79f12f3 100644
--- a/src/cmd/go/internal/toolchain/select.go
+++ b/src/cmd/go/internal/toolchain/select.go
@@ -110,6 +110,14 @@
 		return
 	}
 
+	// As a special case, let "go env GOMOD" and "go env GOWORK" be handled by
+	// the local toolchain. Users expect to be able to look up GOMOD and GOWORK
+	// since the go.mod and go.work file need to be determined to determine
+	// the minimum toolchain. See issue #61455.
+	if len(os.Args) == 3 && os.Args[1] == "env" && (os.Args[2] == "GOMOD" || os.Args[2] == "GOWORK") {
+		return
+	}
+
 	// Interpret GOTOOLCHAIN to select the Go toolchain to run.
 	gotoolchain := cfg.Getenv("GOTOOLCHAIN")
 	gover.Startup.GOTOOLCHAIN = gotoolchain
diff --git a/src/cmd/go/testdata/script/env_gomod_issue61455.txt b/src/cmd/go/testdata/script/env_gomod_issue61455.txt
new file mode 100644
index 0000000..8a94549
--- /dev/null
+++ b/src/cmd/go/testdata/script/env_gomod_issue61455.txt
@@ -0,0 +1,24 @@
+env TESTGO_VERSION=go1.500
+env TESTGO_VERSION_SWITCH=mismatch
+
+# go env GOMOD should not trigger a toolchain download
+cd $GOPATH/mod
+go env GOMOD
+stdout mod[/\\]go.mod
+! stderr 'go: toolchain go1.500 invoked to provide go1.700'
+
+# go env GOWORK should not trigger a toolchain download
+cd $GOPATH/work
+go env GOWORK
+stdout work[/\\]go.work
+! stderr 'go: toolchain go1.500 invoked to provide go1.700'
+
+-- $GOPATH/mod/go.mod --
+module example.com
+
+go 1.700
+
+-- $GOPATH/work/go.work --
+module example.com
+
+go 1.700
\ No newline at end of file