![반복자](/images/patterns/cards/iterator-mini.png?id=76c28bb48f997b36965983dd2b41f02e)
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}