봄맞이 세일
반복자

Go로 작성된 반복자

반복자는 복잡한 데이터 구조의 내부 세부 정보를 노출하지 않고 해당 구조를 차례대로 순회할 수 있도록 하는 행동 디자인 패턴입니다.

반복자 덕분에 클라이언트들은 단일 반복기 인터페이스를 사용하여 유사한 방식으로 다른 컬렉션들의 요소들을 탐색할 수 있습니다.

개념적인 예시

반복자 패턴의 주요 아이디어는 컬렉션의 순회 논리를 반복자라는 다른 객체로 추출하는 것입니다. 이 반복자는 컬렉션의 형식과 관계없이 해당 컬렉션을 순회하는 일반적인 메서드를 제공합니다.

collection.go: 컬렉션

package main

type Collection interface {
	createIterator() Iterator
}

userCollection.go: 구상 컬렉션

package main

type UserCollection struct {
	users []*User
}

func (u *UserCollection) createIterator() Iterator {
	return &UserIterator{
		users: u.users,
	}
}

iterator.go: 반복자

package main

type Iterator interface {
	hasNext() bool
	getNext() *User
}

userIterator.go: 구상 반복자

package main

type UserIterator struct {
	index int
	users []*User
}

func (u *UserIterator) hasNext() bool {
	if u.index < len(u.users) {
		return true
	}
	return false

}
func (u *UserIterator) getNext() *User {
	if u.hasNext() {
		user := u.users[u.index]
		u.index++
		return user
	}
	return nil
}

user.go: 클라이언트 코드

package main

type User struct {
	name string
	age  int
}

main.go: 클라이언트 코드

package main

import "fmt"

func main() {

	user1 := &User{
		name: "a",
		age:  30,
	}
	user2 := &User{
		name: "b",
		age:  20,
	}

	userCollection := &UserCollection{
		users: []*User{user1, user2},
	}

	iterator := userCollection.createIterator()

	for iterator.hasNext() {
		user := iterator.getNext()
		fmt.Printf("User is %+v\n", user)
	}
}

output.txt: 실행 결과

User is &{name:a age:30}
User is &{name:b age:20}

다른 언어로 작성된 반복자

C#으로 작성된 반복자 C++로 작성된 반복자 자바로 작성된 반복자 PHP로 작성된 반복자 파이썬으로 작성된 반복자 루비로 작성된 반복자 러스트로 작성된 반복자 스위프트로 작성된 반복자 타입스크립트로 작성된 반복자