When executing the main function which requires command line arguments, user can set `go-run-args` to pass command line arguments to compiled binary. The example below demonstrates how to pass command line arguments by setting `go-run-args` as file local variable: package main import ( "fmt" "os" "strconv" ) func main() { //Atoi converts a string to an int fmt.Println("Arguments:", os.Args) a, _ := strconv.Atoi(os.Args[1]) b, _ := strconv.Atoi(os.Args[2]) result := sum(a, b) fmt.Printf("The sum of %d and %d is %d\n", a, b, result) } func sum(a, b int) int { return a + b } // Local Variables: // go-run-args: "10 5" // End:
12 KiB
GO layer
Description
This layer adds extensive support for go to Spacemacs.
Features:
- gofmt/goimports on file save (to enable, see Configuration)
- 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
- Test generation with go-gen-test
- Get packages faster with gopkgs
- Fill a structure with default values using the fillstruct
- LSP backend
Install
Pre-requisites
You will need gocode
, gogetdoc
, godef
, godoctor
and many others
to get all the goodies of this layer:
go get -u -v github.com/mdempsky/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
go get -u -v github.com/zmb3/gogetdoc
go get -u -v github.com/cweill/gotests/...
go get -u github.com/haya14busa/gopkgs/cmd/gopkgs
go get -u -v github.com/davidrjenni/reftools/cmd/fillstruct
go get -u github.com/josharian/impl
If you wish to use a linters aggregator tool, you can enable gometalinter
or golangci-lint
.
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 golangci-lint
set the value of go-use-golangci-lint
to t:
(go :variables go-use-golangci-lint t)
and install the tool:
go get -u github.com/golangci/golangci-lint/cmd/golangci-lint
For more information read golangci-lint README.md and flycheck-golangci-lint 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.
LSP backend
To enable the LSP backend set the layer variable go-backend
:
(go :variables go-backend 'lsp)
You also need to install the Go Language Server. Consult the installation command for the desired language server found at lsp-mode for instructions.
Backend can be chosen on a per project basis using directory local variables
(files named .dir-locals.el
at the root of a project), an example to use the
go-mode
backend:
;;; Directory Local Variables
;;; For more information see (info "(emacs) Directory Variables")
((go-mode (go-backend . go-mode)))
Note: you can easily add a directory local variable with SPC f v d
.
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
To run gofmt
before save, set the value to a non-nil, e.g.
(setq go-format-before-save t)
To use a different formatter, set the value of gofmt-command
, e.g.
(setq gofmt-command "goimports")
or
(go :variables gofmt-command "goimports")
To run current main package with command line arguments, set the value of
go-run-args
as file local variable, e.g.
// Local Variables:
// go-run-args: "--output run.log"
// End:
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)
If you’re using .editorconfig
in your project, set the value to nil to avoid
confliction, e.g.
(go :variables go-tab-width nil)
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
For auto-completion there are actually two choices. First there is the classic gocode
.
This has been around for quite a long time now, however gocode
has many shortcomings like
not being able to show documentation for build-in objects or being fully dependent on installed binary
files to provide its suggestions.
A more modern and complete solution is provided by gogetdoc
which is able to
precisely detect all documentations in your go projects independent on where
they have been added. This is also the choice recommended from go-mode.el
.
To choose gocode
nothing more needs to be done. To use gogetdoc
you need to set
(go :variables godoc-at-point-function 'godoc-gogetdoc)
in your dotfile
.
If you choose to use gocode
there are some suggestions to improve its results.
As 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 rungo 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 binding | Description |
---|---|
SPC m = |
run “go fmt” |
SPC m e b |
go-play buffer |
SPC m e d |
download go-play snippet |
SPC m e r |
go-play region |
SPC m g a |
jump to matching test file or back from test to code file |
SPC m g c |
open a clone of the current buffer with a coverage info (go tool cover -h for help) |
SPC m g g |
go jump to definition |
SPC m h h |
godoc at point |
SPC m i a |
add import |
SPC m i g |
goto imports |
SPC m i r |
remove unused import |
SPC m r n |
go rename |
SPC m t P |
run “go test” for the current package and all packages under it |
SPC m t g f |
generate tests for all exported functions |
SPC m t g F |
generate tests for all functions |
SPC m t g g |
DWIM generate test for the function in the active region |
SPC m t p |
run “go test” for the current package |
SPC m t s |
run “go test” for the suite you’re currently in (requires gocheck) |
SPC m t t |
run “go test” for the function you’re currently in (while you’re in a _.test.go file) |
SPC m x x |
run “go run” for the current ’main’ package |
Go Guru
Key binding | Description |
---|---|
SPC m f < |
go-guru show possible callers |
SPC m f > |
go-guru show call targets |
SPC m f c |
go-guru show channel sends/receives |
SPC m f d |
go-guru describe symbol at point |
SPC m f e |
go-guru show possible contants/types for error value |
SPC m f f |
go-guru show free variables |
SPC m f i |
go-guru show implements relation |
SPC m f j |
go-guru jump to symbol definition |
SPC m f o |
go-guru set analysis scope |
SPC m f p |
go-guru show what the select expression points to |
SPC m f r |
go-guru show referrers |
SPC m f s |
go-guru show callstack |
Refactoring
Key binding | Description |
---|---|
SPC m r d |
Add comment stubs |
SPC m r e |
Extract code as new function |
SPC m r f |
Add field tags |
SPC m r F |
Remove field tags |
SPC m r i |
Generate method stubs for implementing an interface (go-impl ) |
SPC m r n |
Rename (with godoctor ) |
SPC m r N |
Rename (with go-rename ) |
SPC m r s |
Fill structure with default values |
SPC m r t |
Toggle declaration and assignment |