# Gopls on by default in VS Code Go extension
01 Feb 2021
Tags: tools, gopls
Summary: Gopls, which provides IDE features for Go to many editors, is now used by default in VS Code Go.

Go tools team

##

We're happy to announce that the VS Code Go extension now enables the [gopls
language server](https://github.com/golang/tools/blob/master/gopls/README.md)
by default, to deliver more robust IDE features and better support for Go
modules.

.image gopls/features.gif _ 635
_(`gopls` provides IDE features, such as as intelligent autocompletion, signature help, refactoring, and workspace symbol search.)_

When [Go modules](using-go-modules) were
released two years ago, they completely changed the landscape of Go developer
tooling. Tools like `goimports` and `godef` previously depended on the fact
that code was stored in your `$GOPATH`. When the Go team began rewriting these
tools to work with modules, we immediately realized that we needed a more
systematic approach to bridge the gap.

As a result, we began working on a single Go
[language server](https://microsoft.github.io/language-server-protocol/),
`gopls`, which provides IDE features, such as autocompletion, formatting, and
diagnostics to any compatible editor frontend. This persistent and unified
server is a [fundamental
shift](https://www.youtube.com/watch?v=EFJfdWzBHwE&t=1s) from the earlier
collections of command-line tools.

In addition to working on `gopls`, we sought other ways of creating a stable
ecosystem of editor tooling. Last year, the Go team took responsibility for the
[Go extension for VS Code](https://blog.golang.org/vscode-go). As part of this
work, we smoothed the extension’s integration with the language server—automating
`gopls` updates, rearranging and clarifying `gopls` settings, improving the
troubleshooting workflow, and soliciting feedback through a survey. We’ve also
continued to foster a community of active users and contributors who have
helped us improve the stability, performance, and user experience of the Go
extension.

## Announcement

January 28 marked a major milestone in both the `gopls` and VS Code Go
journeys, as `gopls` is now enabled by default in the Go extension for VS Code.

In advance of this switch we spent a long time iterating on the design, feature
set, and user experience of `gopls`, focusing on improving performance and
stability. For more than a year, `gopls` has been the default in most plugins for
Vim, Emacs, and other editors. We’ve had 24 `gopls` releases, and we’re
incredibly grateful to our users for consistently providing feedback and
reporting issues on each and every one.

We’ve also dedicated time to smoothing the new user experience. We hope that VS
Code Go with `gopls` will be intuitive with clear error messages, but if you have
a question or need to adjust some configuration, you’ll be able to find answers
in our [updated documentation](https://github.com/golang/vscode-go/blob/master/README.md).
We have also recorded [a screencast](https://www.youtube.com/watch?v=1MXIGYrMk80)
to help you get started, as well as
[animations](https://github.com/golang/vscode-go/blob/master/docs/features.md)
to show off some hard-to-find features.

Gopls is the best way of working with Go code, especially with Go modules.
With the upcoming arrival of Go 1.16, in which modules are enabled by default,
VS Code Go users will have the best possible experience out-of-the-box.

Still, this switch does not mean that `gopls` is complete. We will continue
working on bug fixes, new features, and general stability. Our next area of
focus will be improving the user experience when [working with multiple
modules](https://github.com/golang/tools/blob/master/gopls/doc/workspace.md).
Feedback from our larger user base will help inform our next steps.

## So, what should you do?

If you use VS Code, you don’t need to do anything.
When you get the next VS Code Go update, `gopls` will be enabled automatically.

If you use another editor, you are likely using `gopls` already. If not, see
[the `gopls` user guide](https://github.com/golang/tools/blob/master/gopls/README.md)
to learn how to enable `gopls` in your preferred editor. The Language Server
Protocol ensures that `gopls` will continue to offer the same features to every
editor.

If `gopls` is not working for you, please see our [detailed troubleshooting
guide](https://github.com/golang/vscode-go/blob/master/docs/troubleshooting.md)
and file an issue. If you need to, you can always [disable `gopls` in VS
Code](https://github.com/golang/vscode-go/blob/master/docs/settings.md#gouselanguageserver).

## Thank you

To our existing users, thank you for bearing with us as we rewrote our caching
layer for the third time. To our new users, we look forward to hearing your
experience reports and feedback.

Finally, no discussion of Go tooling is complete without mentioning the
valuable contributions of the Go tools community. Thank you for the lengthy
discussions, detailed bug reports, integration tests, and most importantly,
thank you for the fantastic contributions. The most exciting `gopls` features
come from our passionate open-source contributors, and we are appreciative of
your hard work and dedication.

## Learn more

Watch [the screencast](https://www.youtube.com/watch?v=1MXIGYrMk80) for a
walk-through of how to get started with `gopls` and VS Code Go, and see the
[VS Code Go README](https://github.com/golang/vscode-go/blob/master/README.md)
for additional information.

If you’d like to read about `gopls` in more detail, see the
[`gopls` README](https://github.com/golang/tools/blob/master/gopls/README.md).
