Go
Go Basics - 10. Pointers in Go
Updated:
In this article, we are going to explore how pointers work in the Go programming language.
package main
import (
"fmt"
)
func main() {
a := 14
b := a
fmt.Println(a, b)
}
/*
The result of the code above is:
14 14
*/
In this first example, we declare the variable a to be an int of 14. Then we assign the variable b to be the value of a. Since Go is passing by value and not by reference in this example, the variable b is a copy of a.
We can prove this with the following example.
package main
import (
"fmt"
)
func main() {
a := 14
b := a
fmt.Println(a, b)
a = 55
fmt.Println(a, b)
}
/*
The result of the code above is:
14 14
55 14
*/
Pointers
We can use pointers to make the b variable 'point' to the value of a.
package main
import (
"fmt"
)
func main() {
var a int = 14
var b *int = &a
fmt.Println(a, b)
}
/*
The result of the code above is:
14 0x40e020
*/
The variable b now holds the location in memory where the value of the variable a is stored. So, the variable b now 'points' to the same location in memory as the variable a.
Let's break down this new syntax:
var b *int = &a
The * symbol is a pointer, and the & gives the memory address of the variable that comes after it. So in this example we are saying that variable b is a pointer to an int and it is equal to the same location in memory as the variable a.
Dereferencing pointers
package main
import (
"fmt"
)
func main() {
var a int = 14
var b *int = &a
fmt.Println(a, *b)
}
/*
The result of the code above is:
14 14
*/
Notice in this example that the only change made from the previous example is this line:
fmt.Println(a, *b)
Putting the * in front of the variable b is called dereferencing. This might seem a little confusing because in this line
var b *int = &a
the * is a pointer. However, when you then use the same * in front of a pointer, it is called dereferencing, which means give me the value of this pointer.
So to reiterate this example one more time:
var b *int = &a
The * symbol is a pointer, and the & gives the memory address of the variable that comes after it. So in this example we are saying that variable b is a pointer to an int and it is equal to the same location in memory as the variable a.
fmt.Println(a, *b)
The * symbol, in this case, says dereference the pointer b and give me the value that it is 'pointing' to.
So if we modify our earlier example using pointers and dereference we see that by re-declaring the variable a changes the value of the variable b since b is 'pointing' to the same value as a.
package main
import (
"fmt"
)
func main() {
var a int = 14
var b *int = &a
fmt.Println(a, *b)
a = 55
fmt.Println(a, *b)
}
/*
The result of the code above is:
14 14
55 55
*/
Wrap Up
In this article, we learned how to create and work with pointers in Go.