Go > Variables and Constants > Declaration and Initialization > Short variable declaration (:=
Short Variable Declaration in Go (:=)
Learn how to use the short variable declaration operator :=
in Go to simplify variable declaration and initialization. This concise syntax is widely used but has specific rules and limitations. This guide covers its usage, scope, and when to use it effectively.
Basic Usage
The :=
operator declares and initializes a variable in a single step. In the example, message := "Hello, Go!"
declares a new variable named message
, infers its type (string) from the assigned value, and initializes it with the string "Hello, Go!". Similarly, count := 10
declares a variable count
of type int
and initializes it with the value 10.
package main
import "fmt"
func main() {
// Declare and initialize the variable 'message' using :=
message := "Hello, Go!"
// Declare and initialize the variable 'count' using :=
count := 10
fmt.Println(message, count)
}
Concepts Behind the Snippet
The short variable declaration operator :=
is a syntactic sugar in Go that provides a concise way to declare and initialize variables. It can only be used inside a function. The compiler infers the variable's type from the expression on the right-hand side. If the variable already exists in the same scope, :=
will re-assign a value to it and will create a new one if it doesn't exists, as long as a new variable exists in the same statement.
Real-Life Use Case
A common use case is when dealing with functions that return multiple values, such as error handling. The strconv.Atoi
function attempts to convert a string to an integer and returns the integer value and an error. The short variable declaration elegantly handles both return values. In this example, the :=
operator streamlines error handling by declaring and initializing intValue
and err
simultaneously.
package main
import (
"fmt"
"strconv"
)
func main() {
// Simulating data retrieval from a string
data := "123"
// Convert the string to an integer using strconv.Atoi
// err will store any error that occurs during the conversion
intValue, err := strconv.Atoi(data)
// Check if an error occurred during conversion
if err != nil {
fmt.Println("Error converting string to integer:", err)
return
}
fmt.Println("Converted integer:", intValue)
}
Scope Considerations
Variables declared using :=
have block scope. If a variable with the same name exists in an outer scope, :=
will create a new variable in the inner scope, effectively shadowing the outer variable. This example showcases how outerVar
in the inner scope is a different variable than the outerVar
in the main function.
package main
import "fmt"
func main() {
var outerVar int = 20
{
// Short declaration creates a new variable in the inner scope
outerVar := 10
fmt.Println("Inner scope:", outerVar) // Output: Inner scope: 10
}
fmt.Println("Outer scope:", outerVar) // Output: Outer scope: 20
}
When to Use Them
Use :=
primarily when declaring and initializing a variable for the first time within a function. It promotes code readability and conciseness. It's particularly useful when dealing with multi-value returns from functions or when the variable type is evident from the initialization value. Avoid using it for re-assignment when the variable is already declared in the same scope, use = instead.
Best Practices
:=
for declaring and initializing variables within functions.:=
for re-assignment in the same scope; use =
instead.:=
in inner scopes.
Interview Tip
Be prepared to explain the behavior of :=
in different scopes, especially regarding variable shadowing. Understand when it creates a new variable versus when it re-assigns an existing one. Knowing the difference between declaration and assignment, and how :=
handles both, is crucial.
Alternatives
The alternative to :=
is to explicitly declare the variable using var
followed by assignment using =
. For example:
var message string
message = "Hello, Go!"
This approach is more verbose but can be clearer in some situations, especially when the variable type is not immediately obvious from the initialization value.
Pros
Cons
:=
for re-assignment can create unexpected behavior.
FAQ
-
Can I use
:=
outside of a function?
No, the short variable declaration operator:=
can only be used inside a function body. Outside of a function, you must usevar
for variable declaration. -
What happens if I try to use
:=
to re-assign an existing variable in the same scope?
If you attempt to use:=
to re-assign a variable that has already been declared in the same scope, and no new variables are being declared, the compiler will throw an error. You should use the=
operator for re-assignment. -
Does
:=
always create a new variable?
No,:=
creates a new variable only if the variable hasn't been declared in the current scope. If the variable is already declared, and it is part of a multiple assignment with at least one new variable declaration, it will only be assigned.