Summer SALE
반복자

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로 작성된 반복자 파이썬으로 작성된 반복자 루비로 작성된 반복자 러스트로 작성된 반복자 스위프트로 작성된 반복자 타입스크립트로 작성된 반복자