[Golang] 정렬(Sort)를 위한 sort.Interface 샘플 코드

Go에서 데이터 요소들을 가지는 슬라이스를 정렬하기 위해서는 sort 패키지의 Interface 인터페이스의 Len, Less, Swap 매서드를 구현해야 합니다. 아래의 코드는 문자열 데이터 요소를 가지는 슬라이스에 대한 정렬에 대한 sort.Interface의 구현 코드 및 활용 코드입니다.

package main

import (
    "fmt"
    "sort"
)

type StringSlice []string

func (p StringSlice) Len() int           { return len(p) }
func (p StringSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p StringSlice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }

func main() {
   names := []string{"이효숙", "김형준", "김종수", "김졍연", "김도현" }

    fmt.Println(names)

    sort.Sort(StringSlice(names))
    //sort.Strings(names)

    fmt.Println(names)
}

실행해 보면 다음과 같이 정렬되 결과를 볼 수 있습니다.

[이효숙 김형준 김종수 김졍연 김도현]
[김도현 김졍연 김종수 김형준 이효숙]

참고로 19번는 20번 코드로 대체가 가능한데요. 문자열 타입처럼 기본형 타입에 대한 데이터를 구성하는 슬라이스에 대한 정렬은 이미 sort 패키지에서 함수로 제공하고 있습니다.

[Golang] ring 자료구조

Ring 자료구조는 단어가 의미하듯이 Ring 자료를 구성하는 요소들을 순서대로 얻다가 마지막 요소에서 다시 처음 요소로 순회하면서 무한으로 계속 요소 데이터를 얻을 수 있는 자료구조입니다. Go에서 이러한 Ring 자료 구조에 대한 예제 코드는 아래와 같습니다.

package main

import (
    "container/ring"
    "fmt"
    "time"
)

func main() {
    dt := []string{"ONE", "TWO", "THREE", "FOUR", "FIVE"}

    r := ring.New(len(dt))
    for i := 0; i < r.Len(); i++ {
        r.Value = dt[i]
        r = r.Next()
    }

    r.Do(func(x interface{}) {
        fmt.Println(x)
    })

    fmt.Println("------")

    for _ = range time.Tick(time.Second * 1) {
        fmt.Println(r.Value)
        r = r.Next()
    }
}

링의 자료구조 객체는 12번 코드처럼 ring.New 함수를 통해 생성할 수 있으며 이 함수의 인자는 링을 구성하는 데이터 개수입니다. 10번 코드에서 링의 데이터 요소로 구성할 슬라이스 객체를 준비해 두었고 이 슬라이스의 갯수를 인자로 ring.New 함수를 호출하고 있습니다. 13번의 for 문을 통해 슬라이스의 데이터를 하나 하나 링에 추가합니다. 18번 코드에서 링의 Do 함수는 각 요소에 대해 실행할 함수를 지정해 두면 링을 구성하는 모든 데이터 각각에 대해 실행할 함수를 호출해 줍니다. 여기서는 단순히 화면 출력에 대한 코드를 함수로 지정하고 있습니다. 24번 코드가 바로 1초 간격으로 무한 반복으로 링을 구성하는 요소를 얻는 for 문입니다. 위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

ONE
TWO
THREE
FOUR
FIVE
------
ONE
TWO
THREE
FOUR
FIVE
ONE
TWO
THREE
FOUR
FIVE
ONE

.
.
.