Search code examples
arraysgoslice

How to remove duplicates strings or int from Slice in Go


Let's say I have a list of student cities and the size of it could be 100 or 1000, and I want to filter out all duplicates cities.

I want a generic solution that I can use to remove all duplicate strings from any slice.

I am new to Go Language, So I tried to do it by looping and checking if the element exists using another loop function.

Students' Cities List (Data):

studentsCities := []string{"Mumbai", "Delhi", "Ahmedabad", "Mumbai", "Bangalore", "Delhi", "Kolkata", "Pune"}

Functions that I created, and it's doing the job:

func contains(s []string, e string) bool {
    for _, a := range s {
        if a == e {
            return true
        }
    }
    return false
}

func removeDuplicates(strList []string) []string {
    list := []string{}
    for _, item := range strList {
        fmt.Println(item)
        if contains(list, item) == false {
            list = append(list, item)
        }
    }
    return list
}

My solution test

func main() {
    studentsCities := []string{"Mumbai", "Delhi", "Ahmedabad", "Mumbai", "Bangalore", "Delhi", "Kolkata", "Pune"}

    uniqueStudentsCities := removeDuplicates(studentsCities)
    
    fmt.Println(uniqueStudentsCities) // Expected output [Mumbai Delhi Ahmedabad Bangalore Kolkata Pune]
}

I believe that the above solution that I tried is not an optimum solution. Therefore, I need help from you guys to suggest the fastest way to remove duplicates from the slice?

I checked StackOverflow, this question is not being asked yet, so I didn't get any solution.


Solution

  • I found Burak's and Fazlan's solution helpful. Based on that, I implemented the simple functions that help to remove or filter duplicate data from slices of strings, integers, or any other types with generic approach.

    Here are my three functions, first is generic, second one for strings and last one for integers of slices. You have to pass your data and return all the unique values as a result.

    Generic solution: => Go v1.18

    func removeDuplicate[T comparable](sliceList []T) []T {
        allKeys := make(map[T]bool)
        list := []T{}
        for _, item := range sliceList {
            if _, value := allKeys[item]; !value {
                allKeys[item] = true
                list = append(list, item)
            }
        }
        return list
    }
    

    To remove duplicate strings from slice:

    func removeDuplicateStr(strSlice []string) []string {
        allKeys := make(map[string]bool)
        list := []string{}
        for _, item := range strSlice {
            if _, value := allKeys[item]; !value {
                allKeys[item] = true
                list = append(list, item)
            }
        }
        return list
    }
    

    To remove duplicate integers from slice:

    func removeDuplicateInt(intSlice []int) []int {
        allKeys := make(map[int]bool)
        list := []int{}
        for _, item := range intSlice {
            if _, value := allKeys[item]; !value {
                allKeys[item] = true
                list = append(list, item)
            }
        }
        return list
    }
    

    You can update the slice type, and it will filter out all duplicates data for all types of slices.

    Here is the GoPlayground link: https://go.dev/play/p/iyb97KcftMa