Go Pointers and Functions

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.

Did you find this article helpful?