.\"                                      Hey, EMACS: -*- nroff -*-
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.TH GOFMT 1 "2021-09-06"
.\" Please adjust this date whenever revising the manpage.
.SH NAME
gofmt \- format Go programs
.SH SYNOPSIS
.B gofmt
.RI [ flags ]
.RI [ "path ..." ]
.SH DESCRIPTION
Gofmt formats Go programs. It uses tabs for indentation and blanks for
alignment. Alignment assumes that an editor is using a fixed-width font.
.P
Without an explicit path, it processes the standard input. Given a file, it
operates on that file; given a directory, it operates on all .go files in
that directory, recursively. (Files starting with a period are ignored.) By
default, gofmt prints the reformatted sources to standard output.
.SH OPTIONS
.TP
.B \-d
Do not print reformatted sources to standard output.
If a file's formatting is different than gofmt's, print diffs
to standard output.
.TP
.B \-e
Print all (including spurious) errors.
.TP
.B \-l
Do not print reformatted sources to standard output.
If a file's formatting is different from gofmt's, print its name
to standard output.
.TP
.B \-r rule
Apply the rewrite rule to the source before reformatting.
.TP
.B \-s
Try to simplify code (after applying the rewrite rule, if any).
.TP
.B \-w
Do not print reformatted sources to standard output.
If a file's formatting is different from gofmt's, overwrite it
with gofmt's version. If an error occurred during overwriting,
the original file is restored from an automatic backup.
.P
Debugging support:
.TP
.BI "\-cpuprofile " filename
Write cpu profile to the specified file.
.P
The rewrite rule specified with the \-r flag must be a string of the
form:

.Vb 6
\&      pattern -> replacement
.Ve
.P
Both pattern and replacement must be valid Go expressions. In the pattern,
single-character lowercase identifiers serve as wildcards matching arbitrary
sub-expressions; those expressions will be substituted for the same
identifiers in the replacement.
.P
When gofmt reads from standard input, it accepts either a full Go program or
a program fragment. A program fragment must be a syntactically valid
declaration list, statement list, or expression. When formatting such a
fragment, gofmt preserves leading indentation as well as leading and
trailing spaces, so that individual sections of a Go program can be
formatted by piping them through gofmt.
.
.SH EXAMPLES
To check files for unnecessary parentheses:

.Vb 6
\&      gofmt \-r '(a) \-> a' \-l *.go
.Ve

To remove the parentheses:

.Vb 6
\&      gofmt \-r '(a) \-> a' \-w *.go
.Ve

To convert the package tree from explicit slice upper bounds to implicit
ones:

.Vb 6
\&      gofmt \-r 'α[β:len(α)] \-> α[β:]' \-w $GOROOT/src/pkg
.Ve
.
.SS The simplify command
.
When invoked with \-s gofmt will make the following source transformations
where possible.

.Vb 6
\&    An array, slice, or map composite literal of the form:
\&        []T{T{}, T{}}
\&    will be simplified to:
\&        []T{{}, {}}
.Ve

.Vb 6
\&    A slice expression of the form:
\&        s[a:len(s)]
\&    will be simplified to:
\&        s[a:]
.Ve

.Vb 6
\&    A range of the form:
\&        for x, _ = range v {...}
\&    will be simplified to:
\&        for x = range v {...}
.Ve

.Vb 6
\&    A range of the form:
\&        for _ = range v {...}
\&    will be simplified to:
\&        for range v {...}
.Ve
.P
This may result in changes that are incompatible with earlier versions of
Go.
.SH AUTHOR
This manual page was written by Michael Stapelberg <stapelberg@debian.org>
and is maintained by the
Debian Go Compiler Team <team+go-compiler@tracker.debian.org>
based on the output of 'go doc cmd/gofmt'
for the Debian project (and may be used by others).