Learn how to split slices into smaller chunks in Go using the slices.Chunk function. This tutorial provides examples for batch processing, pagination, and more.
last modified April 20, 2025
This tutorial explains how to use the slices.Chunk function in Go. We’ll cover slice operations with practical examples of splitting slices.
The slices.Chunk function divides a slice into smaller chunks of a specified size. It’s part of Go’s experimental slices package.
This function is useful for batch processing, pagination, or parallel processing of data. It returns a slice of slices containing the chunks.
The simplest use of slices.Chunk splits a slice into equal-sized chunks. Here we split a slice of 6 numbers into chunks of size 2.
basic_chunk.go
package main
import ( “fmt” “slices” )
func main() { numbers := []int{1, 2, 3, 4, 5, 6} chunks := slices.Chunk(numbers, 2)
fmt.Println("Original slice:", numbers)
fmt.Println("Chunks:", chunks)
}
We create a slice of numbers and split it into chunks of 2 elements each. The function returns a slice containing three smaller slices.
When the slice length isn’t divisible by chunk size, the last chunk will be smaller. This example demonstrates this behavior.
uneven_chunks.go
package main
import ( “fmt” “slices” )
func main() { letters := []string{“a”, “b”, “c”, “d”, “e”} chunks := slices.Chunk(letters, 2)
fmt.Println("Original slice:", letters)
fmt.Println("Chunks:", chunks)
}
The slice has 5 elements, so chunking by 2 creates 3 chunks. The last chunk contains only one element.
If the chunk size exceeds the slice length, the result contains one chunk with all elements. This example shows this edge case.
large_chunk.go
package main
import ( “fmt” “slices” )
func main() { data := []float64{1.1, 2.2, 3.3} chunks := slices.Chunk(data, 5)
fmt.Println("Original slice:", data)
fmt.Println("Chunks:", chunks)
}
The chunk size 5 is larger than our 3-element slice. The function returns a single chunk containing all elements.
We can use slices.Chunk with custom struct types. This example chunks a slice of Person structs.
struct_chunk.go
package main
import ( “fmt” “slices” )
type Person struct { Name string Age int }
func main() { people := []Person{ {“Alice”, 25}, {“Bob”, 30}, {“Charlie”, 17}, {“Diana”, 22}, }
chunks := slices.Chunk(people, 2)
fmt.Println("People chunks:")
for i, chunk := range chunks {
fmt.Printf("Chunk %d: %v\n", i+1, chunk)
}
}
The slice of Person structs is divided into chunks of 2. Each chunk maintains the original struct type and data.
slices.Chunk handles empty slices gracefully. This example shows the result when chunking an empty slice.
empty_slice.go
package main
import ( “fmt” “slices” )
func main() { var empty []int chunks := slices.Chunk(empty, 3)
fmt.Println("Empty slice chunks:", chunks)
fmt.Println("Number of chunks:", len(chunks))
}
Chunking an empty slice returns an empty slice of slices. This behavior is consistent with mathematical expectations.
This practical example demonstrates using chunks for batch processing. We process data in batches to avoid overwhelming a system.
batch_processing.go
package main
import ( “fmt” “slices” “time” )
func processBatch(batch []int) { fmt.Println(“Processing batch:”, batch) time.Sleep(500 * time.Millisecond) }
func main() { data := make([]int, 10) for i := range data { data[i] = i + 1 }
chunks := slices.Chunk(data, 3)
for _, batch := range chunks {
processBatch(batch)
}
}
We create a slice of 10 numbers and split it into chunks of 3. Each chunk is then processed separately with a simulated delay.
For large slices, chunking can be memory intensive. This example benchmarks chunking performance with different sizes.
performance.go
package main
import ( “fmt” “slices” “time” )
func main() { largeSlice := make([]int, 1_000_000) for i := range largeSlice { largeSlice[i] = i }
sizes := []int{10, 100, 1000, 10000}
for _, size := range sizes {
start := time.Now()
chunks := slices.Chunk(largeSlice, size)
elapsed := time.Since(start)
fmt.Printf("Chunk size %6d: %d chunks, time %v\n",
size, len(chunks), elapsed)
}
}
The execution time depends on chunk size and slice length. Smaller chunks mean more allocations but may be better for parallel processing.
Go experimental slices package documentation
This tutorial covered the slices.Chunk function in Go with practical examples of splitting slices into smaller chunks for various use cases.
My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.
List all Go tutorials.