Go pointers store the memory addresses of variables. And just like regular variables, we can also pass pointers to functions.
Before you learn how to use pointers with functions, make sure to know about
Pointer as Function Argument in Golang
In Go, we can pass pointers as arguments to a function. For example,
// Program to pass pointer as a function argument
package main
import "fmt"
// function definition with a pointer argument
func update(num *int) {
// dereference the pointer
*num = 30
}
func main() {
var number = 55
// function call
update(&number)
fmt.Println("The number is", number)
}
Output
The number is 30
In the above example, we have passed the address of number to the update()
function. The pointer num accepts this argument in the function definition.
func update(num *int) {
...
}
When we change *num
to 30 inside the update()
function, the value of number inside the main()
function is also changed.
This is because num and number are referring to the same address in the memory. So, updating one updates the other as well.
Return Pointers From Function
Just like regular variables, we can also return pointers from a function. For example,
// Program to return a pointer from a function
package main
import "fmt"
func main() {
// function call
result := display()
fmt.Println("Welcome to", *result)
}
func display() *string {
message := "Programiz"
// returns the address of message
return &message
}
Output
Welcome to Programiz
In the above example, we have created a function named display()
that returns a pointer.
func display() *string
Here, *string
indicates that the function returns a pointer of string
type.
Notice the return &message
statement in the display()
function:
func display() *string {
...
return &message
}
This indicates that the function returns the address of the message variable to the main()
function.
The returned address is assigned to the result pointer. To get the value stored in the memory address, we have used the code *result
.
Call By Reference
While passing pointers to a function, we are actually passing a reference (address) of the variable. Instead of working with the actual value, we are working with references like
- accessing value using reference
- changing value using reference
That's why this process of calling a function with pointers is called call by reference in Go.
Let's see an example.
// Program to illustrate call by reference
package main
import "fmt"
// call by value
func callByValue(num int) {
num = 30
fmt.Println( num) // 30
}
// call by reference
func callByReference(num *int) {
*num = 10
fmt.Println(*num) // 10
}
func main() {
var number int
// passing value
callByValue(number)
// passing a reference (address)
callByReference(&number)
}
Here, we have created two functions: callByValue()
and callByReference()
.
In the callByValue()
function, we are directly passing the number variable. Whereas in callByReference()
, we are passing the memory address of number.