How to split a slice into uniform chunks in Go
Splitting a slice into chunks of uniform sizes is pretty straightforward in most programming languages, and its no different in Go.
There are several approaches for splitting a slice in Go, but the easiest method involves iterating over the slice and incrementing by the chunk size. An implementation is shown in the section below.
Loop through the number of chunks
func chunkSlice(slice []int, chunkSize int) [][]int {
var chunks [][]int
for i := 0; i < len(slice); i += chunkSize {
end := i + chunkSize
// necessary check to avoid slicing beyond
// slice capacity
if end > len(slice) {
end = len(slice)
}
chunks = append(chunks, slice[i:end])
}
return chunks
}
Here, a slice called chunks
is created to hold the slice chunks. Next, we iterate through the given slice
using the number of chunks (as specified by chunkSize
), and then append a new chunk to the chunks
variable based on a portion of the original slice
.
On each iteration, it is necessary to check that upper limit of our chunk does not exceed the slice
’s capacity. If it is, we adjust that by setting the end
variable to the length of the slice before attempting to pull out the last chunk.
Note that if the slice length is not divisible by the chunk size, the last chunk will be less than the chunk size.
Here’s a slightly different implementation that achieves the same effect:
func chunkSlice(slice []int, chunkSize int) [][]int {
var chunks [][]int
for {
if len(slice) == 0 {
break
}
// necessary check to avoid slicing beyond
// slice capacity
if len(slice) < chunkSize {
chunkSize = len(slice)
}
chunks = append(chunks, slice[0:chunkSize])
slice = slice[chunkSize:]
}
return chunks
}
This one relies on modifying the original slice continuously and breaking out of the loop once the slice length reaches zero. The chunk size is also adjusted here to avoid slicing beyond slice
’s capacity.
Conclusion
You can try out both implementations on the Go Playground.
Thanks for reading, and happy coding!