Sling Academy
Home/Golang/Passing Arrays to Functions: Go's Value Semantics Explained

Passing Arrays to Functions: Go's Value Semantics Explained

Last updated: November 23, 2024

Go programming language, often referred to as Golang, is well-known for its simplicity and efficiency. One distinct feature of Go is how it handles arrays and slices, particularly when passing them to functions. Understanding Go's value semantics is crucial for writing efficient code. In this article, we'll explore passing arrays to functions in Go with examples ranging from basic to advanced levels.

Understanding Arrays in Go

An array in Go is a fixed-size sequence of elements of a single data type. Arrays in Go are values, meaning that when you assign an array to another array or pass an array to a function, the entire array is copied. This is essentially Go's value semantics.

Basic Example: Passing Arrays to a Function

Let's start with a basic example where we'll define an array and pass it to a function to print its elements.

package main

import "fmt"

func printArray(arr [4]int) {
    for i, v := range arr {
        fmt.Printf("Index %d: Value %d\n", i, v)
    }
}

func main() {
    nums := [4]int{10, 20, 30, 40}
    printArray(nums)
}

In this basic program, the printArray function takes an array of four integers as an argument and prints each element. The array is copied into the function's scope, making Go exhibit value semantics. Changes inside printArray won't affect the nums array in main.

Intermediate Example: Modifying an Array in a Function

Next, let's investigate what happens when we try to modify an array within a function.

package main

import "fmt"

func modifyArray(arr [3]string) {
    arr[0] = "Modified"
    fmt.Println("Inside function: ", arr)
}

func main() {
    words := [3]string{"Hello", "World", "Go"}
    fmt.Println("Before function call: ", words)
    modifyArray(words)
    fmt.Println("After function call: ", words)
}

In this intermediate example, we try to change the first element of the array in the modifyArray function. Notice that after the function call, the original words array remains unchanged. This again demonstrates Go's value semantics, where the function modifies a copy of the array.

Advanced Example: Passing a Pointer to Modify an Array

If modifications to an array need to be preserved after a function call, passing an array by reference (using a pointer) is the solution.

package main

import "fmt"

func modifyArrayPointer(arr *[5]int) {
    arr[0] = 100
    fmt.Println("Inside function: ", *arr)
}

func main() {
    numbers := [5]int{1, 2, 3, 4, 5}
    fmt.Println("Before function call: ", numbers)
    modifyArrayPointer(&numbers)
    fmt.Println("After function call: ", numbers)
}

In this advanced example, the modifyArrayPointer function receives a pointer to the array, enabling it to alter the original array's contents. The change in the first element persists across function calls, demonstrating how to pass an array by reference effectively.

Understanding how Go handles arrays when passed to functions is essential for efficient Go programming. Using value semantics ensures data integrity, while employing pointers allows manipulation of the original data without unnecessary copies. As seen in the provided examples, the choice between these approaches depends on whether function operations require preservation of changes.

Next Article: Sorting Arrays in Go: Techniques and Examples

Previous Article: Using Loops to Iterate Over Arrays in Go

Series: Working with Arrays in Go

Golang

Related Articles

You May Also Like

  • How to remove HTML tags in a string in Go
  • How to remove special characters in a string in Go
  • How to remove consecutive whitespace in a string in Go
  • How to count words and characters in a string in Go
  • Relative imports in Go: Tutorial & Examples
  • How to run Python code with Go
  • How to generate slug from title in Go
  • How to create an XML sitemap in Go
  • How to redirect in Go (301, 302, etc)
  • Using Go with MongoDB: CRUD example
  • Auto deploy Go apps with CI/ CD and GitHub Actions
  • Fixing Go error: method redeclared with different receiver type
  • Fixing Go error: copy argument must have slice type
  • Fixing Go error: attempted to use nil slice
  • Fixing Go error: assignment to constant variable
  • Fixing Go error: cannot compare X (type Y) with Z (type W)
  • Fixing Go error: method has pointer receiver, not called with pointer
  • Fixing Go error: assignment mismatch: X variables but Y values
  • Fixing Go error: array index must be non-negative integer constant