Stable Slice Deduplication
Remove duplicate comparable values while preserving first-seen order, returning a new slice so the caller's data stays untouched.
Code
package main
import "fmt"
func Unique[T comparable](values []T) []T {
seen := make(map[T]struct{}, len(values))
result := make([]T, 0, len(values))
for _, value := range values {
if _, exists := seen[value]; exists {
continue
}
seen[value] = struct{}{}
result = append(result, value)
}
return result
}
func main() {
values := []string{"a", "b", "a", "c", "b"}
unique := Unique(values)
fmt.Println(unique)
fmt.Println(values)
}
Report a problem with this exampleOpens a pre-filled issue on GitHub.