Sometimes you need to find the index of a value in a slice, and often you’re only interested in the first occurrence of that value.
This is typically done using an Index function, which returns the index of the value in the slice or -1 when it’s not found.
Depending on your Go version you can use a different approach:
- In 1.21, you can use the
Indexfunction in theslicespackage in the standard library. - For earlier versions, you can find the same function in the experimental
slicespackage.
These functions compare the slice values using ==. Depending on your situation you may want to compare in a different way. The IndexFunc function allows you to specify a custom comparison function.
If you are using a Go version that does not support generics, you can always implement your own Index function. See the example below.
package main
import (
"fmt"
"slices"
)
func main() {
s := []string{"🌱", "🪡", "🌱"}
x := "🪡"
y := "🙈"
fmt.Println("slices.Index:")
fmt.Printf("index of \"%s\"? %v\n", x, slices.Index(s, x))
fmt.Printf("index of \"%s\"? %v\n", y, slices.Index(s, y))
fmt.Println("---")
fmt.Println("Index:")
fmt.Printf("index of \"%s\"? %v\n", x, Index(s, x))
fmt.Printf("index of \"%s\"? %v\n", y, Index(s, y))
}
// Index returns the index of the first occurrence of v in s.
// Index returns -1 if v is not found in s.
func Index(s []string, v string) int {
for i, vs := range s {
if vs == v {
return i
}
}
return -1
}
It's getting crazy out there* Let's cool down a bit?
Join 800+ icecold subscribers
*Political, social and economical trust keeps eroding. AI is adding non-deterministic fuel to the fire.
I'm currently building attested.systems, a way to make systems verifiable by humans and machines. Sharing what I learn along the way.
Hi! I'm the Willem behind willem.dev
I initially created this website to help developers learn Go, but I'm currently working a project that allows humans and machines to verify remote systems.
You can follow me on Bluesky or LinkedIn.
Happy that you're here and thanks for reading! :)