[go] Sort 패키지의 커스텀 정렬 기능

Go의 sort 패키지는 슬라이스 자료형을 정렬하기 위한 강력한 기능을 제공합니다. 이번 포스트에서는 Go의 sort 패키지를 사용하여 사용자 정의 기준에 따라 슬라이스를 정렬하는 방법에 대해 알아보겠습니다.

슬라이스 정렬기 사용자정의하기

Go 언어에서는 sort 패키지의 기본 정렬 함수를 사용하여 정렬이 가능합니다. 그러나 때로는 사용자 정의 기준에 따라 정렬해야 하는 경우가 있습니다. 이를 위해 Go에서는 사용자 정의 정렬 기능을 제공합니다.

예를들어, 사용자가 정의한 구조체를 기준으로 슬라이스를 정렬해야 하는 경우에는 해당 구조체에 대한 Less 함수를 정의하여 정렬 기준을 지정할 수 있습니다. 다음은 구조체를 기준으로 슬라이스를 정렬하는 예제 코드입니다.

type Person struct {
    Name string
    Age  int
}

type ByAge []Person

func (a ByAge) Len() int           { return len(a) }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }

func main() {
    people := []Person{
        {"Alice", 25},
        {"Bob", 30},
        {"Eve", 20},
    }
    sort.Sort(ByAge(people))
}

위 예제에서 ByAge 타입에 대해 Less 함수를 정의하여 나이 순으로 정렬하는 기준을 지정하였습니다.

다중 조건에 대한 정렬

때로는 단일 기준이 아닌 다중 기준에 따라 정렬해야 하는 경우가 있습니다. 이를 처리하기 위해 sort 패키지는 여러 정렬 함수를 묶을 수 있는 MultiSorter 타입을 제공합니다. 다음은 다중 조건에 따라 정렬하는 예제 코드입니다.

type Person struct {
    Name string
    Age  int
}

type ByName []Person
type ByAge []Person

func (a ByName) Len() int           { return len(a) }
func (a ByName) Less(i, j int) bool { return a[i].Name < a[j].Name }
func (a ByName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }

func (a ByAge) Len() int           { return len(a) }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }

func main() {
    people := []Person{
        {"Alice", 25},
        {"Bob", 30},
        {"Eve", 20},
    }
    
    sort.Sort(ByName(people))
    sort.Sort(ByAge(people))
}

위 예제에서는 ByNameByAge 타입을 이용하여 이름으로 정렬하고, 그 후 나이로 정렬하였습니다.

결론

Go의 sort 패키지를 사용하여 사용자 정의 기준에 따라 슬라이스를 정렬하는 방법에 대해 알아보았습니다. 사용자 정의 정렬 기능을 활용하면 다양한 조건에 따라 슬라이스를 유연하게 정렬할 수 있습니다.

더 많은 정보는 Go 공식 문서를 참고하시기 바랍니다.

관련 링크:

간단한 정보와 예제를 통해 Go Sort 패키지의 커스텀 정렬 기능에 대해 설명해 보았습니다.