컨테이너 사용하기

이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07

링 사용하기

다음은 container/ring 패키지에서 제공하는 링 함수입니다.

  • func New(n int) *Ring: 링 생성
  • func (r *Ring) Do(f func(interface{})): 링의 모든 노드 순회
  • func (r *Ring) Move(n int) *Ring: 링을 회전시킴. 매개변수로 양수를 넣으면 시계 방향, 음수를 넣으면 반 시계 방향으로 회전

이제 링(Ring)을 사용해보겠습니다.

package main

import (
	"container/ring"
	"fmt"
)

func main() {
	data := []string{"Maria", "John", "Andrew", "James"}

	r := ring.New(len(data))       // 노드의 개수를 지정하여 링 생성
	for i := 0; i < r.Len(); i++ { // 링 노드 개수만큼 반복
		r.Value = data[i]      // 링의 노드에 값 넣기
		r = r.Next()           // 다음 노드로  이동
	}

	r.Do(func(x interface{}) { // 링의 모든 노드 순회
		fmt.Println(x)
	})

	fmt.Println("Move forward :")
	r = r.Move(1) // 링을 시계 방향으로 1노드 만큼 회전

	fmt.Println("Curr : ", r.Value)        // Curr :  John
	fmt.Println("Prev : ", r.Prev().Value) // Prev :  Maria
	fmt.Println("Next : ", r.Next().Value) // Next :  Andrew
}

실행 결과

Maria
John
Andrew
James
Move forward :
Curr :  John
Prev :  Maria
Next :  Andrew

링은 원형으로 연결된 이중 연결 리스트입니다. 따라서 처음과 끝이 없고, nil을 가리키는 노드는 존재하지 않습니다.

ring.New 함수에 노드의 개수를 지정하여 링을 생성합니다. 그리고 for 반복문을 사용하여 값을 넣습니다. 반드시 뒤로 가든 앞으로 가든 r = r.Next()처럼 현재 위치를 바꿔주어야 합니다.

data := []string{"Maria", "John", "Andrew", "James"}

r := ring.New(len(data))       // 노드의 개수를 지정하여 링 생성
for i := 0; i < r.Len(); i++ { // 링 노드 개수만큼 반복
	r.Value = data[i]      // 링의 노드에 값 넣기
	r = r.Next()           // 다음 노드로  이동
}

Do 함수는 링의 모든 노드를 순회합니다. 여기서는 모든 노드를 순회하면서 값을 출력합니다.

r.Do(func(x interface{}) { // 링의 모든 노드 순회
	fmt.Println(x)
})

Move 함수는 링을 회전시킵니다. 양수를 넣으면 앞쪽(시계 방향)으로 회전하고, 음수를 넣으면 뒤쪽(반 시계 방향)으로 회전합니다.

r = r.Move(1) // 링을 시계 방향으로 1노드 만큼 회전

링도 리스트와 마찬가지로 현재 노드, 이전 노드, 다음 노드의 값을 가져올 수 있습니다. 여기서는 앞쪽 방향으로 1노드 만큼 회전했으므로 현재 값은 John입니다.

fmt.Println("Curr : ", r.Value)        // Curr :  John
fmt.Println("Prev : ", r.Prev().Value) // Prev :  Maria
fmt.Println("Next : ", r.Next().Value) // Next :  Andrew


그림 55-3 링 회전 과정


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

01 June 2015