Go Pointers and Functions: Memory Management and Reusability

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

  • Go Pointers
  • Functions in Golang

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.


#go  #golang 

Go Pointers and Functions: Memory Management and Reusability
1.00 GEEK