= vs :=
This post will briefly describe the differences between the assignments and short variable declarations in Go. It assumes that you have completed A Tour of Go and have consulted relevant sections of Effective Go and the target audience is primarily newcomers to the Go programming language.
The assignment operator (=
) is used to perform
assignments (i.e. to assign or reassign values to
already declared variables).
The short declaration operator (:=
), on the other hand,
is used to perform short variable declarations),
which are shorthand for regular variable declarations but
without a specified type.
Here are four different ways to create a variable with
static type int
and value 10
, each of which are equivalent:
var a int = 10
var b = 10
var c int
c = 10
d := 10
Unlike regular variable declarations, a short variable declaration
may redeclare variables in multi-value assignments, assuming
at least one variable is new and the redeclared variable is assigned
a value of the same type. You’ll see this property used frequently
when dealing with errors, as it avoids the need to declare differently
named variables such as err1
, err2
, etc. in the same block of code.
For example, consider the CopyFunc
function below, which opens two
files and copies the contents of one file to the other:
func CopyFile(dstName, srcName string) (written int64, err error) {
// 'err' is declared for the first time.
src, err := os.Open(srcName)
if err != nil {
return
}
defer src.Close()
// 'err' is redeclared (no need to declare a new variable
// for the returned error).
dst, err := os.Create(dstName)
if err != nil {
return
}
defer dst.Close()
return io.Copy(dst, src)
}
In general, short variable declarations should be preferred because they
are more concise than regular variable declarations/assignments. Note,
however, that short variable declarations can only be used inside of
functions/methods (declaring global variables at the package level
can only be done using a regular variable declaration: var name type = value
).
Recommended Readings:
- The Assignments and Short variable declarations sections in the official Go Programming Language Specification.
- The Redeclaration and reassignment section in Effective Go.
- Handling errors and Go from the Go Blog.
- The Blank identifier in multiple assignment section in Effective Go.