If you use the ==
or !=
comparison operators you can only compare slices to nil
.
So how do you check if two slices are equal?
Well.. that depends on what you mean by “equal slices”. But often you want to check if slices are of the same length and have equal elements at the same indices.
Depending on your Go version you can:
- In 1.21, use the
Equal
function in theslices
package in the standard library. - For earlier versions, you can find the same function in the experimental
slices
package.
If you are using a Go version that does not support generics, you can always implement your own EqualSlices
function. See the example below:
main.go
package main
import (
"fmt"
"slices"
)
func main() {
x := []string{"🙈", "🙉", "🙊"}
y := []string{"🙈", "🦍"}
fmt.Println("slices.Equal:")
fmt.Println("x equal to y?", slices.Equal(x, y))
fmt.Println("y equal to x?", slices.Equal(y, x))
fmt.Println("x equal to x?", slices.Equal(x, x))
fmt.Println("y equal to y?", slices.Equal(y, y))
fmt.Println("---")
fmt.Println("EqualSlices:")
fmt.Println("x equal to y?", EqualSlices(x, y))
fmt.Println("y equal to x?", EqualSlices(y, x))
fmt.Println("x equal to x?", EqualSlices(x, x))
fmt.Println("y equal to y?", EqualSlices(y, y))
}
// EqualSlices checks if two slices have equal contents.
// For two slices to be equal:
// - They need to have the same number of elements.
// - Each element must be equal using the == operator.
func EqualSlices(s1, s2 []string) bool {
if len(s1) != len(s2) {
return false
}
for i, v := range s1 {
if s2[i] != v {
return false
}
}
return true
}
Stay in the loop, subscribe to my newsletter.
for _, f := range []string{
"🏋 Excercises and solutions",
"🔥 Subscriber-only content",
"💌 New posts in your inbox",
"💸 Discounts",
} {
you.Enjoy(f)
}