GO layer

img/go.png

Description

This layer adds extensive support for go.

Features:

  • gofmt/goimports on file save
  • Auto-completion using go-autocomplete (with the auto-completion layer)
  • Source analysis using go-guru
  • Refactoring with godoctor
  • Edit struct field tag with gomodifytags
  • Linting with flycheck's built-in checkers or flycheck-gometalinter
  • Coverage profile visualization

Install

Pre-requisites

You will need gocode, godef and godoctor:

  go get -u -v github.com/nsf/gocode
  go get -u -v github.com/rogpeppe/godef
  go get -u -v golang.org/x/tools/cmd/guru
  go get -u -v golang.org/x/tools/cmd/gorename
  go get -u -v golang.org/x/tools/cmd/goimports

If you wish to use gometalinter set the value of go-use-gometalinter to t:

  (go :variables go-use-gometalinter t)

and install the tool:

  go get -u -v github.com/alecthomas/gometalinter
  gometalinter --install --update

For more information read gometalinter README.md and flycheck-gometalinter README.md

If you wish to use godoctor for refactoring, install it too:

  go get -u -v github.com/godoctor/godoctor
  go install github.com/godoctor/godoctor

If you want to use gomodifytags to edit field tags, install it too:

  go get -u -v github.com/fatih/gomodifytags

Make sure that the gocode executable is in your PATH. For information about setting up $PATH, check out the corresponding section in the FAQ (SPC h f $PATH RET).

For best results, make sure that the auto-completion and syntax-checking layers are enabled as well.

Layer

To use this configuration layer, add it to your ~/.spacemacs. You will need to add go to the existing dotspacemacs-configuration-layers list in this file.

Configuration

By default, go buffers are run through gofmt on save. To use a different formatter, set the value of gofmt-command, e.g.

  (setq gofmt-command "goimports")

or

  (go :variables gofmt-command "goimports")

Indentation

By default, the tab width in Go mode is 8 spaces. To use a different value set the layer variable go-tab-width, e.g.

  (go :variables go-tab-width 4)

Tests

If you're using gocheck in your project you can use the go-use-gocheck-for-testing variable to enable suite testing and to get single function testing to work.

go-coverage-display-buffer-func controls how go-coverage should display the coverage buffer. See display-buffer for a list of possible functions. The default value is display-buffer-reuse-window.

Tests are run in a compilation buffer displayed in a popup window that can be closed by pressing C-g from any other window. The variable go-test-buffer-name can be customized to set the output buffer name.

To provide additional arguments to go test, specify go-use-test-args.

  (go :variables go-use-test-args "-race -timeout 10s"

Guru

Go Oracle has been deprecated as of October 1, 2016, it's replacement is go-guru.

If you would like to use the goguru bindings in your work, you will need to install it, and in your project you will need to set the scope with SPC m f o. The scope is a comma separated set of packages, and go's recursive operator is supported. In addition, you can prefix with - to exclude a package from searching.

In addition, GOPATH must be set prior to go-guru initialization.

Autocomplete

gocode uses the output from installed binary files to provide its suggestions. You have a few options to ensure you always get up to date suggestions:

  • Run go install ./... in your package directory when you make a file change.
  • Run gocode set autobuild true to have gocode attempt to run go install ./... for you.
  • You can configure your task runner to run go install ./... command on every file change.

Working with Go

Go commands (start with m):

Key BindingDescription
SPC m e bgo-play buffer
SPC m e ddownload go-play snippet
SPC m e rgo-play region
SPC m g ajump to matching test file or back from test to code file
SPC m g copen a clone of the current buffer with a coverage info (go tool cover -h for help)
SPC m g ggo jump to definition
SPC m i aadd import
SPC m i ggoto imports
SPC m i rremove unused import
SPC m h hgodoc at point
SPC m r ngo rename
SPC m t prun "go test" for the current package
SPC m t Prun "go test" for the current package and all packages under it
SPC m t srun "go test" for the suite you're currently in (requires gocheck)
SPC m t trun "go test" for the function you're currently in (while you're in a _.test.go file)
SPC m x xrun "go run" for the current 'main' package

Go Guru

Key BindingDescription
SPC m f <go-guru show possible callers
SPC m f >go-guru show call targets
SPC m f cgo-guru show channel sends/receives
SPC m f dgo-guru describe symbol at point
SPC m f ego-guru show possible contants/types for error value
SPC m f fgo-guru show free variables
SPC m f igo-guru show implements relation
SPC m f jgo-guru jump to symbol definition
SPC m f ogo-guru set analysis scope
SPC m f pgo-guru show what the select expression points to
SPC m f rgo-guru show referrers
SPC m f sgo-guru show callstack

Refactoring

Key BindingDescription
SPC m r dAdd comment stubs
SPC m r eExtract code as new function
SPC m r fAdd field tags
SPC m r FRemove field tags
SPC m r nRename (with godoctor)
SPC m r NRename (with go-rename)
SPC m r tToggle declaration and assignment