Description
Go 1.12 has added a go
directive to the go.mod file. It's documented in the following places.
At https://golang.org/doc/go1.12#modules:
The
go
directive in a go.mod file now indicates the version of the language used by the files within that module. It will be set to the current release (go 1.12
) if no existing version is present. If the go directive for a module specifies a version newer than the toolchain in use, the go command will attempt to build the packages regardless, and will note the mismatch only if that build fails.
Additionally, a relevant paragraph from https://golang.org/doc/go1.12#compiler:
The compiler now accepts a
-lang
flag to set the Go language version to use. For example,-lang=go1.8
causes the compiler to emit an error if the program uses type aliases, which were added in Go 1.9. Language changes made before Go 1.12 are not consistently enforced.
At https://golang.org/cmd/go/#hdr-The_go_mod_file:
go, to set the expected language version;
There is additional information available in issues, proposals, commit messages and code review comments, which I did not mention above. However, that information is not readily accessible to users.
It is very common for package authors to aim to ensure their Go packages can be used in multiple versions of Go. Sometimes it's just Go 1.12.x and Go 1.11.x (the current and previous releases). Other times the goal is to support even older versions of Go. This often includes running tests in CI with those versions of Go to ensure that the build and tests are successful. When these package authors add a go.mod file file to their repositories, they should be able to make a sensible decision about what go
directive should be included.
Problem
I believe the current documentation is not sufficient for module authors to make a well-informed decision on whether to include the go
directive in their go.mod files, and if so, what the value of the go
directive should be.
I think we should try to improve documentation to resolve that. But first I want to make sure others agree that it's a problem.
(This is based on looking over the discussions that have happened around various PRs/CLs where the go
directive is introduced, often by people who are very familiar with modules. Sometimes this happens more often due to #30790.)
/cc @ianlancetaylor @dsnet @bcmills @julieqiu @heschik @matloob