| <!DOCTYPE html> |
| <html lang="en" data-theme="auto"> |
| <head> |
| |
| <link rel="preconnect" href="https://www.googletagmanager.com"> |
| <script >(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': |
| new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], |
| j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= |
| 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); |
| })(window,document,'script','dataLayer','GTM-W8MVQXG');</script> |
| |
| <meta charset="utf-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <meta name="theme-color" content="#00add8"> |
| <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons"> |
| <link rel="stylesheet" href="/css/styles.css"> |
| <link rel="icon" href="/images/favicon-gopher.png" sizes="any"> |
| <link rel="apple-touch-icon" href="/images/favicon-gopher-plain.png"/> |
| <link rel="icon" href="/images/favicon-gopher.svg" type="image/svg+xml"> |
| <link rel="me" href="https://hachyderm.io/@golang"> |
| |
| |
| <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': |
| new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], |
| j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= |
| 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); |
| })(window,document,'script','dataLayer','GTM-W8MVQXG');</script> |
| |
| <script src="/js/site.js"></script> |
| <meta name="og:url" content="https://go.dev/doc/toolchain"> |
| <meta name="og:title" content="Go Toolchains - The Go Programming Language"> |
| <title>Go Toolchains - The Go Programming Language</title> |
| |
| <meta name="og:image" content="https://go.dev/doc/gopher/gopher5logo.jpg"> |
| <meta name="twitter:image" content="https://go.dev/doc/gopher/gopherbelly300.jpg"> |
| <meta name="twitter:card" content="summary"> |
| <meta name="twitter:site" content="@golang"> |
| </head> |
| <body class="Site"> |
| |
| <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W8MVQXG" |
| height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> |
| |
| |
| |
| <header class="Site-header js-siteHeader"> |
| <div class="Header Header--dark"> |
| <nav class="Header-nav"> |
| <a href="/"> |
| <img |
| class="js-headerLogo Header-logo" |
| src="/images/go-logo-white.svg" |
| alt="Go"> |
| </a> |
| <div class="skip-navigation-wrapper"> |
| <a class="skip-to-content-link" aria-label="Skip to main content" href="#main-content"> Skip to Main Content </a> |
| </div> |
| <div class="Header-rightContent"> |
| <ul class="Header-menu"> |
| <li class="Header-menuItem "> |
| <a href="#" class="js-desktop-menu-hover" aria-label=Why Go aria-describedby="dropdown-description"> |
| Why Go <i class="material-icons" aria-hidden="true">arrow_drop_down</i> |
| </a> |
| <div class="screen-reader-only" id="dropdown-description" hidden> |
| Press Enter to activate/deactivate dropdown |
| </div> |
| <ul class="Header-submenu js-desktop-submenu-hover" aria-label="submenu"> |
| <li class="Header-submenuItem"> |
| <div> |
| <a href="/solutions/case-studies"> |
| Case Studies |
| |
| </a> |
| </div> |
| <p>Common problems companies solve with Go</p> |
| </li> |
| <li class="Header-submenuItem"> |
| <div> |
| <a href="/solutions/use-cases"> |
| Use Cases |
| |
| </a> |
| </div> |
| <p>Stories about how and why companies use Go</p> |
| </li> |
| <li class="Header-submenuItem"> |
| <div> |
| <a href="/security/"> |
| Security |
| |
| </a> |
| </div> |
| <p>How Go can help keep you secure by default</p> |
| </li> |
| </ul> |
| </li> |
| <li class="Header-menuItem "> |
| <a href="/learn/" aria-label=Learn aria-describedby="dropdown-description"> |
| Learn |
| </a> |
| <div class="screen-reader-only" id="dropdown-description" hidden> |
| Press Enter to activate/deactivate dropdown |
| </div> |
| </li> |
| <li class="Header-menuItem Header-menuItem--active"> |
| <a href="#" class="js-desktop-menu-hover" aria-label=Docs aria-describedby="dropdown-description"> |
| Docs <i class="material-icons" aria-hidden="true">arrow_drop_down</i> |
| </a> |
| <div class="screen-reader-only" id="dropdown-description" hidden> |
| Press Enter to activate/deactivate dropdown |
| </div> |
| <ul class="Header-submenu js-desktop-submenu-hover" aria-label="submenu"> |
| <li class="Header-submenuItem"> |
| <div> |
| <a href="/doc/effective_go"> |
| Effective Go |
| |
| </a> |
| </div> |
| <p>Tips for writing clear, performant, and idiomatic Go code</p> |
| </li> |
| <li class="Header-submenuItem"> |
| <div> |
| <a href="/doc"> |
| Go User Manual |
| |
| </a> |
| </div> |
| <p>A complete introduction to building software with Go</p> |
| </li> |
| <li class="Header-submenuItem"> |
| <div> |
| <a href="https://pkg.go.dev/std"> |
| Standard library |
| |
| </a> |
| </div> |
| <p>Reference documentation for Go's standard library</p> |
| </li> |
| <li class="Header-submenuItem"> |
| <div> |
| <a href="/doc/devel/release"> |
| Release Notes |
| |
| </a> |
| </div> |
| <p>Learn what's new in each Go release</p> |
| </li> |
| </ul> |
| </li> |
| <li class="Header-menuItem "> |
| <a href="https://pkg.go.dev" aria-label=Packages aria-describedby="dropdown-description"> |
| Packages |
| </a> |
| <div class="screen-reader-only" id="dropdown-description" hidden> |
| Press Enter to activate/deactivate dropdown |
| </div> |
| </li> |
| <li class="Header-menuItem "> |
| <a href="#" class="js-desktop-menu-hover" aria-label=Community aria-describedby="dropdown-description"> |
| Community <i class="material-icons" aria-hidden="true">arrow_drop_down</i> |
| </a> |
| <div class="screen-reader-only" id="dropdown-description" hidden> |
| Press Enter to activate/deactivate dropdown |
| </div> |
| <ul class="Header-submenu js-desktop-submenu-hover" aria-label="submenu"> |
| <li class="Header-submenuItem"> |
| <div> |
| <a href="/talks/"> |
| Recorded Talks |
| |
| </a> |
| </div> |
| <p>Videos from prior events</p> |
| </li> |
| <li class="Header-submenuItem"> |
| <div> |
| <a href="https://www.meetup.com/pro/go"> |
| Meetups |
| <i class="material-icons">open_in_new</i> |
| </a> |
| </div> |
| <p>Meet other local Go developers</p> |
| </li> |
| <li class="Header-submenuItem"> |
| <div> |
| <a href="/wiki/Conferences"> |
| Conferences |
| <i class="material-icons">open_in_new</i> |
| </a> |
| </div> |
| <p>Learn and network with Go developers from around the world</p> |
| </li> |
| <li class="Header-submenuItem"> |
| <div> |
| <a href="/blog"> |
| Go blog |
| |
| </a> |
| </div> |
| <p>The Go project's official blog.</p> |
| </li> |
| <li class="Header-submenuItem"> |
| <div> |
| <a href="/help"> |
| Go project |
| |
| </a> |
| </div> |
| <p>Get help and stay informed from Go</p> |
| </li> |
| <li class="Header-submenuItem"> |
| <div> |
| Get connected |
| </div> |
| <p></p> |
| <div class="Header-socialIcons"> |
| |
| <a class="Header-socialIcon" aria-label="Get connected with google-groups (Opens in new window)" href="https://groups.google.com/g/golang-nuts"><img src="/images/logos/social/google-groups.svg" /></a> |
| <a class="Header-socialIcon" aria-label="Get connected with github (Opens in new window)" href="https://github.com/golang"><img src="/images/logos/social/github.svg" /></a> |
| <a class="Header-socialIcon" aria-label="Get connected with twitter (Opens in new window)" href="https://twitter.com/golang"><img src="/images/logos/social/twitter.svg" /></a> |
| <a class="Header-socialIcon" aria-label="Get connected with reddit (Opens in new window)" href="https://www.reddit.com/r/golang/"><img src="/images/logos/social/reddit.svg" /></a> |
| <a class="Header-socialIcon" aria-label="Get connected with slack (Opens in new window)" href="https://invite.slack.golangbridge.org/"><img src="/images/logos/social/slack.svg" /></a> |
| <a class="Header-socialIcon" aria-label="Get connected with stack-overflow (Opens in new window)" href="https://stackoverflow.com/tags/go"><img src="/images/logos/social/stack-overflow.svg" /></a> |
| </div> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| <button class="Header-navOpen js-headerMenuButton Header-navOpen--white" aria-label="Open navigation."> |
| </button> |
| </div> |
| </nav> |
| |
| </div> |
| </header> |
| <aside class="NavigationDrawer js-header"> |
| <nav class="NavigationDrawer-nav"> |
| <div class="NavigationDrawer-header"> |
| <a href="/"> |
| <img class="NavigationDrawer-logo" src="/images/go-logo-blue.svg" alt="Go."> |
| </a> |
| </div> |
| <ul class="NavigationDrawer-list"> |
| |
| <li class="NavigationDrawer-listItem js-mobile-subnav-trigger NavigationDrawer-hasSubnav"> |
| <a href="#"><span>Why Go</span> <i class="material-icons">navigate_next</i></a> |
| |
| <div class="NavigationDrawer NavigationDrawer-submenuItem"> |
| <nav class="NavigationDrawer-nav"> |
| <div class="NavigationDrawer-header"> |
| <a href="#"><i class="material-icons">navigate_before</i>Why Go</a> |
| </div> |
| <ul class="NavigationDrawer-list"> |
| <li class="NavigationDrawer-listItem"> |
| <a href="/solutions/case-studies"> |
| Case Studies |
| |
| </a> |
| |
| </li> |
| <li class="NavigationDrawer-listItem"> |
| <a href="/solutions/use-cases"> |
| Use Cases |
| |
| </a> |
| |
| </li> |
| <li class="NavigationDrawer-listItem"> |
| <a href="/security/"> |
| Security |
| |
| </a> |
| |
| </li> |
| </ul> |
| </div> |
| </div> |
| </li> |
| |
| |
| |
| <li class="NavigationDrawer-listItem "> |
| <a href="/learn/">Learn</a> |
| </li> |
| |
| |
| <li class="NavigationDrawer-listItem js-mobile-subnav-trigger NavigationDrawer-listItem--active NavigationDrawer-hasSubnav"> |
| <a href="#"><span>Docs</span> <i class="material-icons">navigate_next</i></a> |
| |
| <div class="NavigationDrawer NavigationDrawer-submenuItem"> |
| <nav class="NavigationDrawer-nav"> |
| <div class="NavigationDrawer-header"> |
| <a href="#"><i class="material-icons">navigate_before</i>Docs</a> |
| </div> |
| <ul class="NavigationDrawer-list"> |
| <li class="NavigationDrawer-listItem"> |
| <a href="/doc/effective_go"> |
| Effective Go |
| |
| </a> |
| |
| </li> |
| <li class="NavigationDrawer-listItem"> |
| <a href="/doc"> |
| Go User Manual |
| |
| </a> |
| |
| </li> |
| <li class="NavigationDrawer-listItem"> |
| <a href="https://pkg.go.dev/std"> |
| Standard library |
| |
| </a> |
| |
| </li> |
| <li class="NavigationDrawer-listItem"> |
| <a href="/doc/devel/release"> |
| Release Notes |
| |
| </a> |
| |
| </li> |
| </ul> |
| </div> |
| </div> |
| </li> |
| |
| |
| |
| <li class="NavigationDrawer-listItem "> |
| <a href="https://pkg.go.dev">Packages</a> |
| </li> |
| |
| |
| <li class="NavigationDrawer-listItem js-mobile-subnav-trigger NavigationDrawer-hasSubnav"> |
| <a href="#"><span>Community</span> <i class="material-icons">navigate_next</i></a> |
| |
| <div class="NavigationDrawer NavigationDrawer-submenuItem"> |
| <nav class="NavigationDrawer-nav"> |
| <div class="NavigationDrawer-header"> |
| <a href="#"><i class="material-icons">navigate_before</i>Community</a> |
| </div> |
| <ul class="NavigationDrawer-list"> |
| <li class="NavigationDrawer-listItem"> |
| <a href="/talks/"> |
| Recorded Talks |
| |
| </a> |
| |
| </li> |
| <li class="NavigationDrawer-listItem"> |
| <a href="https://www.meetup.com/pro/go"> |
| Meetups |
| <i class="material-icons">open_in_new</i> |
| </a> |
| |
| </li> |
| <li class="NavigationDrawer-listItem"> |
| <a href="/wiki/Conferences"> |
| Conferences |
| <i class="material-icons">open_in_new</i> |
| </a> |
| |
| </li> |
| <li class="NavigationDrawer-listItem"> |
| <a href="/blog"> |
| Go blog |
| |
| </a> |
| |
| </li> |
| <li class="NavigationDrawer-listItem"> |
| <a href="/help"> |
| Go project |
| |
| </a> |
| |
| </li> |
| <li class="NavigationDrawer-listItem"> |
| <div>Get connected</div> |
| <div class="Header-socialIcons"> |
| |
| <a class="Header-socialIcon" href="https://groups.google.com/g/golang-nuts"><img src="/images/logos/social/google-groups.svg" /></a> |
| <a class="Header-socialIcon" href="https://github.com/golang"><img src="/images/logos/social/github.svg" /></a> |
| <a class="Header-socialIcon" href="https://twitter.com/golang"><img src="/images/logos/social/twitter.svg" /></a> |
| <a class="Header-socialIcon" href="https://www.reddit.com/r/golang/"><img src="/images/logos/social/reddit.svg" /></a> |
| <a class="Header-socialIcon" href="https://invite.slack.golangbridge.org/"><img src="/images/logos/social/slack.svg" /></a> |
| <a class="Header-socialIcon" href="https://stackoverflow.com/tags/go"><img src="/images/logos/social/stack-overflow.svg" /></a> |
| </div> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </li> |
| |
| |
| </ul> |
| </nav> |
| </aside> |
| <div class="NavigationDrawer-scrim js-scrim" role="presentation"></div> |
| <main class="SiteContent SiteContent--default" id="main-content"> |
| |
| <article class="Article Article--doc"> |
| |
| |
| <h1>Go Toolchains</h1> |
| <h2 id="intro">Introduction</h2> |
| <p>Starting in Go 1.21, the Go distribution consists of a <code>go</code> command and a bundled Go toolchain, |
| which is the standard library as well as the compiler, assembler, and other tools. |
| The <code>go</code> command can use its bundled Go toolchain as well as other versions |
| that it finds in the local <code>PATH</code> or downloads as needed.</p> |
| <p>The choice of Go toolchain being used depends on the <code>GOTOOLCHAIN</code> environment setting |
| and the <code>go</code> and <code>toolchain</code> lines in the main module’s <code>go.mod</code> file or the current workspace’s <code>go.work</code> file. |
| As you move between different main modules and workspaces, |
| the toolchain version being used can vary, just as module dependency versions do.</p> |
| <p>In the standard configuration, the <code>go</code> command uses its own bundled toolchain |
| when that toolchain is at least as new as the <code>go</code> or <code>toolchain</code> lines in the main module or workspace. |
| For example, when using the <code>go</code> command bundled with Go 1.21.3 in a main module that says <code>go 1.21.0</code>, |
| the <code>go</code> command uses Go 1.21.3. |
| When the <code>go</code> or <code>toolchain</code> line is newer than the bundled toolchain, |
| the <code>go</code> command runs the newer toolchain instead. |
| For example, when using the <code>go</code> command bundled with Go 1.21.3 in a main module that says <code>go 1.21.9</code>, |
| the <code>go</code> command finds and runs Go 1.21.9 instead. |
| It first looks in the PATH for a program named <code>go1.21.9</code> and otherwise downloads and caches |
| a copy of the Go 1.21.9 toolchain. |
| This automatic toolchain switching can be disabled, but in that case, |
| for more precise forwards compatibility, |
| the <code>go</code> command will refuse to run in a main module or workspace in which the <code>go</code> line |
| requires a newer version of Go. |
| That is, the <code>go</code> line sets the minimum required Go version necessary to use a module or workspace.</p> |
| <p>Modules that are dependencies of other modules may need to set a minimum Go version requirement |
| lower than the preferred toolchain to use when working in that module directly. |
| In this case, the <code>toolchain</code> line in <code>go.mod</code> or <code>go.work</code> sets a preferred toolchain |
| that takes precedence over the <code>go</code> line when the <code>go</code> command is deciding |
| which toolchain to use.</p> |
| <p>The <code>go</code> and <code>toolchain</code> lines can be thought of as specifying the version requirements |
| for the module’s dependency on the Go toolchain itself, just as the <code>require</code> lines in <code>go.mod</code> |
| specify the version requirements for dependencies on other modules. |
| The <code>go get</code> command manages the Go toolchain dependency just as it |
| manages dependencies on other modules. |
| For example, <code>go get go@latest</code> updates the module to require the latest released Go toolchain.</p> |
| <p>The <code>GOTOOLCHAIN</code> environment setting can force a specific Go version, overriding |
| the <code>go</code> and <code>toolchain</code> lines. For example, to test a package with Go 1.21rc3:</p> |
| <pre><code>GOTOOLCHAIN=go1.21rc3 go test |
| </code></pre> |
| <p>The default <code>GOTOOLCHAIN</code> setting is <code>auto</code>, which enables the toolchain switching described earlier. |
| The alternate form <code><name>+auto</code> sets the default toolchain to use before deciding whether to |
| switch further. For example <code>GOTOOLCHAIN=go1.21.3+auto</code> directs the <code>go</code> command to |
| begin its decision with a default of using Go 1.21.3 but still use a newer toolchain if |
| directed by <code>go</code> and <code>toolchain</code> lines. |
| Because the default <code>GOTOOLCHAIN</code> setting can be changed with <code>go env -w</code>, |
| if you have Go 1.21.0 or later installed, then</p> |
| <pre><code>go env -w GOTOOLCHAIN=go1.21.3+auto |
| </code></pre> |
| <p>is equivalent to replacing your Go 1.21.0 installation with Go 1.21.3.</p> |
| <p>The rest of this document explains how Go toolchains are versioned, chosen, and managed in more detail.</p> |
| <h2 id="version">Go versions</h2> |
| <p>Released versions of Go use the version syntax ‘1.<em>N</em>.<em>P</em>’, denoting the <em>P</em>th release of Go 1.<em>N</em>. |
| The initial release is 1.<em>N</em>.0, like in ‘1.21.0’. Later releases like 1.<em>N</em>.9 are often referred to as patch releases.</p> |
| <p>Go 1.<em>N</em> release candidates, which are issued before 1.<em>N</em>.0, use the version syntax ‘1.<em>N</em>rc<em>R</em>’. |
| The first release candidate for Go 1.<em>N</em> has version 1.<em>N</em>rc1, like in <code>1.23rc1</code>.</p> |
| <p>The syntax ‘1.<em>N</em>’ is called a “language version”. It denotes the overall family of Go releases |
| implementing that version of the Go language and standard library.</p> |
| <p>The language version for a Go version is the result of truncating everything after the <em>N</em>: |
| 1.21, 1.21rc2, and 1.21.3 all implement language version 1.21.</p> |
| <p>Released Go toolchains such as Go 1.21.0 and Go 1.21rc1 report that specific version |
| (for example, <code>go1.21.0</code> or <code>go1.21rc1</code>) |
| from <code>go version</code> and <a href="/pkg/runtime/#Version"><code>runtime.Version</code></a>. |
| Unreleased (still in development) Go toolchains built from the Go development repository |
| instead report only the language version (for example, <code>go1.21</code>).</p> |
| <p>Any two Go versions can be compared to decide whether one is less than, greater than, |
| or equal to the other. If the language versions are different, that decides the comparison: |
| 1.21.9 < 1.22. Within a language version, the ordering from least to greatest is: |
| the language version itself, then release candidates ordered by <em>R</em>, then releases ordered by <em>P</em>.</p> |
| <p>For example, 1.21 < 1.21rc1 < 1.21rc2 < 1.21.0 < 1.21.1 < 1.21.2.</p> |
| <p>Before Go 1.21, the initial release of a Go toolchain was version 1.<em>N</em>, not 1.<em>N</em>.0, |
| so for <em>N</em> < 21, the ordering is adjusted to place 1.<em>N</em> after the release candidates.</p> |
| <p>For example, 1.20rc1 < 1.20rc2 < 1.20rc3 < 1.20 < 1.20.1.</p> |
| <p>Earlier versions of Go had beta releases, with versions like 1.18beta2. |
| Beta releases are placed immediately before release candidates in the version ordering.</p> |
| <p>For example, 1.18beta1 < 1.18beta2 < 1.18rc1 < 1.18 < 1.18.1.</p> |
| <h2 id="name">Go toolchain names</h2> |
| <p>The standard Go toolchains are named <code>go<i>V</i></code> where <em>V</em> is a Go version |
| denoting a beta release, release candidate, or release. |
| For example, <code>go1.21rc1</code> and <code>go1.21.0</code> are toolchain names; |
| <code>go1.21</code> and <code>go1.22</code> are not (the initial releases are <code>go1.21.0</code> and <code>go1.22.0</code>), |
| but <code>go1.20</code> and <code>go1.19</code> are.</p> |
| <p>Non-standard toolchains use names of the form <code>go<i>V</i>-<i>suffix</i></code> |
| for any suffix.</p> |
| <p>Toolchains are compared by comparing the version <code><i>V</i></code> embedded in the name |
| (dropping the initial <code>go</code> and discarding off any suffix beginning with <code>-</code>). |
| For example, <code>go1.21.0</code> and <code>go1.21.0-custom</code> compare equal for ordering purposes.</p> |
| <h2 id="config">Module and workspace configuration</h2> |
| <p>Go modules and workspaces specify version-related configuration |
| in their <code>go.mod</code> or <code>go.work</code> files.</p> |
| <p>The <code>go</code> line declares the minimum required Go version for using |
| the module or workspace. |
| For compatibility reasons, if the <code>go</code> line is omitted from a <code>go.mod</code> file, |
| the module is considered to have an implicit <code>go 1.16</code> line, |
| and if the <code>go</code> line is omitted from a <code>go.work</code> file, |
| the workspace is considered to have an implicit <code>go 1.18</code> line.</p> |
| <p>The <code>toolchain</code> line declares a suggested toolchain to use with |
| the module or workspace. |
| As described in “<a href="#select">Go toolchain selection</a>” below, |
| the <code>go</code> command may run this specific toolchain when operating |
| in that module or workspace |
| if the default toolchain’s version is less than the suggested toolchain’s version. |
| If the <code>toolchain</code> line is omitted, |
| the module or workspace is considered to have an implicit |
| <code>toolchain go<i>V</i></code> line, |
| where <em>V</em> is the Go version from the <code>go</code> line.</p> |
| <p>For example, a <code>go.mod</code> that says <code>go 1.21.0</code> with no <code>toolchain</code> line |
| is interpreted as if it had a <code>toolchain go1.21.0</code> line.</p> |
| <p>The Go toolchain refuses to load a module or workspace that declares |
| a minimum required Go version greater than the toolchain’s own version.</p> |
| <p>For example, Go 1.21.2 will refuse to load a module or workspace |
| with a <code>go 1.21.3</code> or <code>go 1.22</code> line.</p> |
| <p>A module’s <code>go</code> line must declare a version greater than or equal to |
| the <code>go</code> version declared by each of the modules listed in <code>require</code> statements. |
| A workspace’s <code>go</code> line must declare a version greater than or equal to |
| the <code>go</code> version declared by each of the modules listed in <code>use</code> statements.</p> |
| <p>For example, if module <em>M</em> requires a dependency <em>D</em> with a <code>go.mod</code> |
| that declares <code>go 1.22.0</code>, then <em>M</em>’s <code>go.mod</code> cannot say <code>go 1.21.3</code>.</p> |
| <p>The <code>go</code> line for each module sets the language version the compiler |
| enforces when compiling packages in that module. |
| The language version can be changed on a per-file basis by using a |
| <a href="/cmd/go#hdr-Build_constraints">build constraint</a>.</p> |
| <p>For example, a module containing code that uses the Go 1.21 language version |
| should have a <code>go.mod</code> file with a <code>go</code> line such as <code>go 1.21</code> or <code>go 1.21.3</code>. |
| If a specific source file should be compiled only when using a newer Go toolchain, |
| adding <code>//go:build go1.22</code> to that source file both ensures that only Go 1.22 and |
| newer toolchains will compile the file and also changes the language version in that |
| file to Go 1.22.</p> |
| <p>The <code>go</code> and <code>toolchain</code> lines are most conveniently and safely modified |
| by using <code>go get</code>; see the <a href="#get">section dedicated to <code>go get</code> below</a>.</p> |
| <p>Before Go 1.21, Go toolchains treated the <code>go</code> line as an advisory requirement: |
| if builds succeeded the toolchain assumed everything worked, |
| and if not it printed a note about the potential version mismatch. |
| Go 1.21 changed the <code>go</code> line to be a mandatory requirement instead. |
| This behavior is partly backported to earlier language versions: |
| Go 1.19 releases starting at Go 1.19.13 and Go 1.20 releases starting at Go 1.20.8, |
| refuse to load workspaces or modules declaring version Go 1.22 or later.</p> |
| <p>Before Go 1.21, toolchains did not require a module |
| or workspace to have a <code>go</code> line greater than or equal to the |
| <code>go</code> version required by each of its dependency modules.</p> |
| <h2 id="GOTOOLCHAIN">The <code>GOTOOLCHAIN</code> setting</h2> |
| <p>The <code>go</code> command selects the Go toolchain to use based on the <code>GOTOOLCHAIN</code> setting. |
| To find the <code>GOTOOLCHAIN</code> setting, the <code>go</code> command uses the standard rules for any |
| Go environment setting:</p> |
| <ul> |
| <li> |
| <p>If <code>GOTOOLCHAIN</code> is set to a non-empty value in the process environment |
| (as queried by <a href="/pkg/os/#Getenv"><code>os.Getenv</code></a>), the <code>go</code> command uses that value.</p> |
| </li> |
| <li> |
| <p>Otherwise, if <code>GOTOOLCHAIN</code> is set in the user’s environment default file |
| (managed with |
| <a href="/cmd/go/#hdr-Print_Go_environment_information"><code>go env -w</code> and <code>go env -u</code></a>), |
| the <code>go</code> command uses that value.</p> |
| </li> |
| <li> |
| <p>Otherwise, if <code>GOTOOLCHAIN</code> is set in the bundled Go toolchain’s environment |
| default file (<code>$GOROOT/go.env</code>), the <code>go</code> command uses that value.</p> |
| </li> |
| </ul> |
| <p>In standard Go toolchains, the <code>$GOROOT/go.env</code> file sets the default <code>GOTOOLCHAIN=auto</code>, |
| but repackaged Go toolchains may change this value.</p> |
| <p>If the <code>$GOROOT/go.env</code> file is missing or does not set a default, the <code>go</code> command |
| assumes <code>GOTOOLCHAIN=local</code>.</p> |
| <p>Running <code>go env GOTOOLCHAIN</code> prints the <code>GOTOOLCHAIN</code> setting.</p> |
| <h2 id="select">Go toolchain selection</h2> |
| <p>At startup, the <code>go</code> command selects which Go toolchain to use. |
| It consults the <code>GOTOOLCHAIN</code> setting, |
| which takes the form <code><name></code>, <code><name>+auto</code>, or <code><name>+path</code>. |
| <code>GOTOOLCHAIN=auto</code> is shorthand for <code>GOTOOLCHAIN=local+auto</code>; |
| similarly, <code>GOTOOLCHAIN=path</code> is shorthand for <code>GOTOOLCHAIN=local+path</code>. |
| The <code><name></code> sets the default Go toolchain: |
| <code>local</code> indicates the bundled Go toolchain |
| (the one that shipped with the <code>go</code> command being run), and otherwise <code><name></code> must |
| be a specific Go toolchain name, such as <code>go1.21.0</code>. |
| The <code>go</code> command prefers to run the default Go toolchain. |
| As noted above, starting in Go 1.21, Go toolchains refuse to run in |
| workspaces or modules that require newer Go versions. |
| Instead, they report an error and exit.</p> |
| <p>When <code>GOTOOLCHAIN</code> is set to <code>local</code>, the <code>go</code> command always runs the bundled Go toolchain.</p> |
| <p>When <code>GOTOOLCHAIN</code> is set to <code><name></code> (for example, <code>GOTOOLCHAIN=go1.21.0</code>), |
| the <code>go</code> command always runs that specific Go toolchain. |
| If a binary with that name is found in the system PATH, the <code>go</code> command uses it. |
| Otherwise the <code>go</code> command uses a Go toolchain it downloads and verifies.</p> |
| <p>When <code>GOTOOLCHAIN</code> is set to <code><name>+auto</code> or <code><name>+path</code> (or the shorthands <code>auto</code> or <code>path</code>), |
| the <code>go</code> command selects and runs a newer Go version as needed. |
| Specifically, it consults the <code>toolchain</code> and <code>go</code> lines in the current workspace’s |
| <code>go.work</code> file or, when there is no workspace, |
| the main module’s <code>go.mod</code> file. |
| If the <code>go.work</code> or <code>go.mod</code> file has a <code>toolchain <tname></code> line |
| and <code><tname></code> is newer than the default Go toolchain, |
| then the <code>go</code> command runs <code><tname></code> instead. |
| If the file has a <code>toolchain default</code> line, |
| then the <code>go</code> command runs the default Go toolchain, |
| disabling any attempt at updating beyond <code><name></code>. |
| Otherwise, if the file has a <code>go <version></code> line |
| and <code><version></code> is newer than the default Go toolchain, |
| then the <code>go</code> command runs <code>go<version></code> instead.</p> |
| <p>To run a toolchain other than the bundled Go toolchain, |
| the <code>go</code> command searches the process’s executable path |
| (<code>$PATH</code> on Unix and Plan 9, <code>%PATH%</code> on Windows) |
| for a program with the given name (for example, <code>go1.21.3</code>) and runs that program. |
| If no such program is found, the <code>go</code> command |
| <a href="#download">downloads and runs the specified Go toolchain</a>. |
| Using the <code>GOTOOLCHAIN</code> form <code><name>+path</code> disables the download fallback, |
| causing the <code>go</code> command to stop after searching the executable path.</p> |
| <p>Running <code>go version</code> prints the selected Go toolchain’s version |
| (by running the selected toolchain’s implementation of <code>go version</code>).</p> |
| <p>Running <code>GOTOOLCHAIN=local go version</code> prints the bundled Go toolchain’s version.</p> |
| <h2 id="switch">Go toolchain switches</h2> |
| <p>For most commands, the workspace’s <code>go.work</code> or the main module’s <code>go.mod</code> |
| will have a <code>go</code> line that is at least as new as the <code>go</code> line in any module dependency, |
| due to the version ordering <a href="#config">configuration requirements</a>. |
| In this case, the startup toolchain selection runs a new enough Go toolchain |
| to complete the command.</p> |
| <p>Some commands incorporate new module versions as part of their operation: |
| <code>go get</code> adds new module dependencies to the main module; |
| <code>go work use</code> adds new local modules to the workspace; |
| <code>go work sync</code> resynchronizes a workspace with local modules that may have been updated |
| since the workspace was created; |
| <code>go install package@version</code> and <code>go run package@version</code> |
| effectively run in an empty main module and add <code>package@version</code> as a new dependency. |
| All these commands may encounter a module with a <code>go.mod</code> <code>go</code> line |
| requiring a newer Go version than the currently executed Go version.</p> |
| <p>When a command encounters a module requiring a newer Go version |
| and <code>GOTOOLCHAIN</code> permits running different toolchains |
| (it is one of the <code>auto</code> or <code>path</code> forms), |
| the <code>go</code> command chooses and switches to an appropriate newer toolchain |
| to continue executing the current command.</p> |
| <p>Any time the <code>go</code> command switches toolchains after startup toolchain selection, |
| it prints a message explaining why. For example:</p> |
| <pre><code>go: module example.com/widget@v1.2.3 requires go >= 1.24rc1; switching to go 1.27.9 |
| </code></pre> |
| <p>As shown in the example, the <code>go</code> command may switch to a toolchain |
| newer than the discovered requirement. |
| In general the <code>go</code> command aims to switch to a supported Go toolchain.</p> |
| <p>To choose the toolchain, the <code>go</code> command first obtains a list of available toolchains. |
| For the <code>auto</code> form, the <code>go</code> command downloads a list of available toolchains. |
| For the <code>path</code> form, the <code>go</code> command scans the PATH for any executables |
| named for valid toolchains and uses a list of all the toolchains it finds. |
| Using that list of toolchains, the <code>go</code> command identifies up to three candidates:</p> |
| <ul> |
| <li>the latest release candidate of an unreleased Go language version (1.<em>N</em>₃rc<em>R</em>₃),</li> |
| <li>the latest patch release of the most recently released Go language version (1.<em>N</em>₂.<em>P</em>₂), and</li> |
| <li>the latest patch release of the previous Go language version (1.<em>N</em>₁.<em>P</em>₁).</li> |
| </ul> |
| <p>These are the supported Go releases according to Go’s <a href="/doc/devel/release#policy">release policy</a>. |
| Consistent with <a href="https://research.swtch.com/vgo-mvs" rel="noreferrer" target="_blank">minimal version selection</a>, |
| the <code>go</code> command then conservatively uses the candidate with the <em>minimum</em> (oldest) |
| version that satisfies the new requirement.</p> |
| <p>For example, suppose <code>example.com/widget@v1.2.3</code> requires Go 1.24rc1 or later. |
| The <code>go</code> command obtains the list of available toolchains |
| and finds that the latest patch releases of the two most recent Go toolchains are |
| Go 1.28.3 and Go 1.27.9, |
| and the release candidate Go 1.29rc2 is also available. |
| In this situation, the <code>go</code> command will choose Go 1.27.9. |
| If <code>widget</code> had required Go 1.28 or later, the <code>go</code> command would choose Go 1.28.3, |
| because Go 1.27.9 is too old. |
| If <code>widget</code> had required Go 1.29 or later, the <code>go</code> command would choose Go 1.29rc2, |
| because both Go 1.27.9 and Go 1.28.3 are too old.</p> |
| <p>Commands that incorporate new module versions that require new Go versions |
| write the new minimum <code>go</code> version requirement to the current workspace’s <code>go.work</code> file |
| or the main module’s <code>go.mod</code> file, updating the <code>go</code> line. |
| For <a href="https://research.swtch.com/vgo-principles#repeatability" rel="noreferrer" target="_blank">repeatability</a>, |
| any command that updates the <code>go</code> line also updates the <code>toolchain</code> line |
| to record its own toolchain name. |
| The next time the <code>go</code> command runs in that workspace or module, |
| it will use that updated <code>toolchain</code> line during <a href="#select">toolchain selection</a>.</p> |
| <p>For example, <code>go get example.com/widget@v1.2.3</code> may print a switching notice |
| like above and switch to Go 1.27.9. |
| Go 1.27.9 will complete the <code>go get</code> and update the <code>toolchain</code> line |
| to say <code>toolchain go1.27.9</code>. |
| The next <code>go</code> command run in that module or workspace will select <code>go1.27.9</code> |
| during startup and will not print any switching message.</p> |
| <p>In general, if any <code>go</code> command is run twice, if the first prints a switching |
| message, the second will not, because the first also updated <code>go.work</code> or <code>go.mod</code> |
| to select the right toolchain at startup. |
| The exception is the <code>go install package@version</code> and <code>go run package@version</code> forms, |
| which run in no workspace or main module and cannot write a <code>toolchain</code> line. |
| They print a switching message every time they need to switch |
| to a newer toolchain.</p> |
| <h2 id="download">Downloading toolchains</h2> |
| <p>When using <code>GOTOOLCHAIN=auto</code> or <code>GOTOOLCHAIN=<name>+auto</code>, the Go command |
| downloads newer toolchains as needed. |
| These toolchains are packaged as special modules |
| with module path <code>golang.org/toolchain</code> |
| and version <code>v0.0.1-go<i>VERSION</i>.<i>GOOS</i>-<i>GOARCH</i></code>. |
| Toolchains are downloaded like any other module, |
| meaning that toolchain downloads can be proxied by setting <code>GOPROXY</code> |
| and have their checksums checked by the Go checksum database. |
| Because the specific toolchain used depends on the system’s own |
| default toolchain as well as the local operating system and architecture (GOOS and GOARCH), |
| it is not practical to write toolchain module checksums to <code>go.sum</code>. |
| Instead, toolchain downloads fail for lack of verification if <code>GOSUMDB=off</code>. |
| <code>GOPRIVATE</code> and <code>GONOSUMDB</code> patterns do not apply to the toolchain downloads.</p> |
| <h2 id="get">Managing Go version module requirements with <code>go get</code></h2> |
| <p>In general the <code>go</code> command treats the <code>go</code> and <code>toolchain</code> lines |
| as declaring versioned toolchain dependencies of the main module. |
| The <code>go get</code> command can manage these lines just as it manages |
| the <code>require</code> lines that specify versioned module dependencies.</p> |
| <p>For example, <code>go get go@1.22.1 toolchain@1.24rc1</code> changes the main module’s |
| <code>go.mod</code> file to read <code>go 1.22.1</code> and <code>toolchain go1.24rc1</code>.</p> |
| <p>The <code>go</code> command understands that the <code>go</code> dependency requires a <code>toolchain</code> dependency |
| with a greater or equal Go version.</p> |
| <p>Continuing the example, a later <code>go get go@1.25.0</code> will update |
| the toolchain to <code>go1.25.0</code> as well. |
| When the toolchain matches the <code>go</code> line exactly, it can be |
| omitted and implied, so this <code>go get</code> will delete the <code>toolchain</code> line.</p> |
| <p>The same requirement applies in reverse when downgrading: |
| if the <code>go.mod</code> starts at <code>go 1.22.1</code> and <code>toolchain go1.24rc1</code>, |
| then <code>go get toolchain@go1.22.9</code> will update only the <code>toolchain</code> line, |
| but <code>go get toolchain@go1.21.3</code> will downgrade the <code>go</code> line to |
| <code>go 1.21.3</code> as well. |
| The effect will be to leave just <code>go 1.21.3</code> with no <code>toolchain</code> line.</p> |
| <p>The special form <code>toolchain@none</code> means to remove any <code>toolchain</code> line, |
| as in <code>go get toolchain@none</code> or <code>go get go@1.25.0 toolchain@none</code>.</p> |
| <p>The <code>go</code> command understands the version syntax for |
| <code>go</code> and <code>toolchain</code> dependencies as well as queries.</p> |
| <p>For example, just as <code>go get example.com/widget@v1.2</code> uses |
| the latest <code>v1.2</code> version of <code>example.com/widget</code> (perhaps <code>v1.2.3</code>), |
| <code>go get go@1.22</code> uses the latest available release of the Go 1.22 language version |
| (perhaps <code>1.22rc3</code>, or perhaps <code>1.22.3</code>). |
| The same applies to <code>go get toolchain@go1.22</code>.</p> |
| <p>The <code>go get</code> and <code>go mod tidy</code> commands maintain the <code>go</code> line to |
| be greater than or equal to the <code>go</code> line of any required dependency module.</p> |
| <p>For example, if the main module has <code>go 1.22.1</code> and we run |
| <code>go get example.com/widget@v1.2.3</code> which declares <code>go 1.24rc1</code>, |
| then <code>go get</code> will update the main module’s <code>go</code> line to <code>go 1.24rc1</code>.</p> |
| <p>Continuing the example, a later <code>go get go@1.22.1</code> will |
| downgrade <code>example.com/widget</code> to a version compatible with Go 1.22.1 |
| or else remove the requirement entirely, |
| just as it would when downgrading any other dependency of <code>example.com/widget</code>.</p> |
| <p>Before Go 1.21, the suggested way to update a module to a new Go version (say, Go 1.22) |
| was <code>go mod tidy -go=1.22</code>, to make sure that any adjustments |
| specific to Go 1.22 were made to the <code>go.mod</code> at the same time that the |
| <code>go</code> line is updated. |
| That form is still valid, but the simpler <code>go get go@1.22</code> is now preferred.</p> |
| <p>When <code>go get</code> is run in a module in a directory contained in a workspace root, |
| <code>go get</code> mostly ignores the workspace, |
| but it does update the <code>go.work</code> file to upgrade the <code>go</code> line |
| when the workspace would otherwise be left with too old a <code>go</code> line.</p> |
| <h2 id="work">Managing Go version workspace requirements with <code>go work</code></h2> |
| <p>As noted in the previous section, <code>go get</code> run in a directory |
| inside a workspace root will take care to update the <code>go.work</code> file’s <code>go</code> line |
| as needed to be greater than or equal to any module inside that root. |
| However, workspaces can also refer to modules outside the root directory; |
| running <code>go get</code> in those directories may result in an invalid workspace |
| configuration, one in which the <code>go</code> version declared in <code>go.work</code> is less |
| than one or more of the modules in the <code>use</code> directives.</p> |
| <p>The command <code>go work use</code>, which adds new <code>use</code> directives, also checks |
| that the <code>go</code> version in the <code>go.work</code> file is new enough for all the |
| existing <code>use</code> directives. |
| To update a workspace that has gotten its <code>go</code> version out of sync |
| with its modules, run <code>go work use</code> with no arguments.</p> |
| <p>The commands <code>go work init</code> and <code>go work sync</code> also update the <code>go</code> |
| version as needed.</p> |
| <p>To remove the <code>toolchain</code> line from a <code>go.work</code> file, use |
| <code>go work edit -toolchain=none</code>.</p> |
| |
| |
| |
| </article> |
| |
| </main> |
| <footer class="Site-footer"> |
| <div class="Footer"> |
| <div class="Container"> |
| <div class="Footer-links"> |
| <div class="Footer-linkColumn"> |
| <a href="/solutions/" class="Footer-link Footer-link--primary" aria-describedby="footer-description"> |
| Why Go |
| </a> |
| <a href="/solutions/use-cases" class="Footer-link" aria-describedby="footer-description"> |
| Use Cases |
| </a> |
| <a href="/solutions/case-studies" class="Footer-link" aria-describedby="footer-description"> |
| Case Studies |
| </a> |
| </div> |
| <div class="Footer-linkColumn"> |
| <a href="/learn/" class="Footer-link Footer-link--primary" aria-describedby="footer-description"> |
| Get Started |
| </a> |
| <a href="/play" class="Footer-link" aria-describedby="footer-description"> |
| Playground |
| </a> |
| <a href="/tour/" class="Footer-link" aria-describedby="footer-description"> |
| Tour |
| </a> |
| <a href="https://stackoverflow.com/questions/tagged/go?tab=Newest" class="Footer-link" aria-describedby="footer-description"> |
| Stack Overflow |
| </a> |
| <a href="/help/" class="Footer-link" aria-describedby="footer-description"> |
| Help |
| </a> |
| </div> |
| <div class="Footer-linkColumn"> |
| <a href="https://pkg.go.dev" class="Footer-link Footer-link--primary" aria-describedby="footer-description"> |
| Packages |
| </a> |
| <a href="/pkg/" class="Footer-link" aria-describedby="footer-description"> |
| Standard Library |
| </a> |
| <a href="https://pkg.go.dev/about" class="Footer-link" aria-describedby="footer-description"> |
| About Go Packages |
| </a> |
| </div> |
| <div class="Footer-linkColumn"> |
| <a href="/project" class="Footer-link Footer-link--primary" aria-describedby="footer-description"> |
| About |
| </a> |
| <a href="/dl/" class="Footer-link" aria-describedby="footer-description"> |
| Download |
| </a> |
| <a href="/blog/" class="Footer-link" aria-describedby="footer-description"> |
| Blog |
| </a> |
| <a href="https://github.com/golang/go/issues" class="Footer-link" aria-describedby="footer-description"> |
| Issue Tracker |
| </a> |
| <a href="/doc/devel/release" class="Footer-link" aria-describedby="footer-description"> |
| Release Notes |
| </a> |
| <a href="/brand" class="Footer-link" aria-describedby="footer-description"> |
| Brand Guidelines |
| </a> |
| <a href="/conduct" class="Footer-link" aria-describedby="footer-description"> |
| Code of Conduct |
| </a> |
| </div> |
| <div class="Footer-linkColumn"> |
| <a href="https://www.twitter.com/golang" class="Footer-link Footer-link--primary" aria-describedby="footer-description"> |
| Connect |
| </a> |
| <a href="https://www.twitter.com/golang" class="Footer-link" aria-describedby="footer-description"> |
| Twitter |
| </a> |
| <a href="https://github.com/golang" class="Footer-link" aria-describedby="footer-description"> |
| GitHub |
| </a> |
| <a href="https://invite.slack.golangbridge.org/" class="Footer-link" aria-describedby="footer-description"> |
| Slack |
| </a> |
| <a href="https://reddit.com/r/golang" class="Footer-link" aria-describedby="footer-description"> |
| r/golang |
| </a> |
| <a href="https://www.meetup.com/pro/go" class="Footer-link" aria-describedby="footer-description"> |
| Meetup |
| </a> |
| <a href="https://golangweekly.com/" class="Footer-link" aria-describedby="footer-description"> |
| Golang Weekly |
| </a> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="screen-reader-only" id="footer-description" hidden> |
| Opens in new window. |
| </div> |
| <div class="Footer"> |
| <div class="Container Container--fullBleed"> |
| <div class="Footer-bottom"> |
| <img class="Footer-gopher" src="/images/gophers/pilot-bust.svg" alt="The Go Gopher"> |
| <ul class="Footer-listRow"> |
| <li class="Footer-listItem"> |
| <a href="/copyright" aria-describedby="footer-description">Copyright</a> |
| </li> |
| <li class="Footer-listItem"> |
| <a href="/tos" aria-describedby="footer-description">Terms of Service</a> |
| </li> |
| <li class="Footer-listItem"> |
| <a href="http://www.google.com/intl/en/policies/privacy/" aria-describedby="footer-description" |
| target="_blank" |
| rel="noopener"> |
| Privacy Policy |
| </a> |
| </li> |
| <li class="Footer-listItem"> |
| <a |
| href="/s/website-issue" aria-describedby="footer-description" |
| target="_blank" |
| rel="noopener" |
| > |
| Report an Issue |
| </a> |
| </li> |
| <li class="Footer-listItem go-Footer-listItem"> |
| <button class="go-Button go-Button--text go-Footer-toggleTheme js-toggleTheme" aria-label="Toggle theme"> |
| <img |
| data-value="auto" |
| class="go-Icon go-Icon--inverted" |
| height="24" |
| width="24" |
| src="/images/icons/brightness_6_gm_grey_24dp.svg" |
| alt="System theme"> |
| <img |
| data-value="dark" |
| class="go-Icon go-Icon--inverted" |
| height="24" |
| width="24" |
| src="/images/icons/brightness_2_gm_grey_24dp.svg" |
| alt="Dark theme"> |
| <img |
| data-value="light" |
| class="go-Icon go-Icon--inverted" |
| height="24" |
| width="24" |
| src="/images/icons/light_mode_gm_grey_24dp.svg" |
| alt="Light theme"> |
| </button> |
| </li> |
| </ul> |
| <a class="Footer-googleLogo" target="_blank" href="https://google.com" rel="noopener"> |
| <img class="Footer-googleLogoImg" src="/images/google-white.png" alt="Google logo"> |
| </a> |
| </div> |
| </div> |
| </div> |
| <script src="/js/jquery.js"></script> |
| <script src="/js/carousels.js"></script> |
| <script src="/js/searchBox.js"></script> |
| <script src="/js/misc.js"></script> |
| <script src="/js/hats.js"></script> |
| <script src="/js/playground.js"></script> |
| <script src="/js/godocs.js"></script> |
| <script async src="/js/copypaste.js"></script> |
| </footer> |
| <section class="Cookie-notice js-cookieNotice"> |
| <div>go.dev uses cookies from Google to deliver and enhance the quality of its services and to |
| analyze traffic. <a target=_blank href="https://policies.google.com/technologies/cookies">Learn more.</a></div> |
| <div><button class="go-Button">Okay</button></div> |
| </section> |
| </body> |
| </html> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |