Go에서 반복자를 구성하는 관용적 방법
채널은 채널과 유사한 반복 메커니즘을 제공합니다. 고루틴 누출 위험 없이 반복을 중단할 수 없는 등의 제한 사항이 있지만 Go에서 반복자 패턴을 만드는 관용적인 방법은 아닙니다. 이러한 목적에는 클로저가 더 적합합니다.
package main import "fmt" func main() { gen := newEven() fmt.Println(gen()) fmt.Println(gen()) fmt.Println(gen()) gen = nil // release for garbage collection } func newEven() func() int { n := 0 // closure captures variable n return func() int { n += 2 return n } }
또 다른 옵션은 메서드와 함께 명명된 유형을 사용하는 것입니다.
package main import "fmt" func main() { gen := even(0) fmt.Println(gen.next()) fmt.Println(gen.next()) fmt.Println(gen.next()) } type even int func (e *even) next() int { *e += 2 return int(*e) }
Go의 최고 수준 기능으로 인해 생성기를 연결하는 것은 간단합니다. 예는 다음과 같습니다.
package main import "fmt" func main() { gen := mapInt(newEven(), square) fmt.Println(gen()) fmt.Println(gen()) fmt.Println(gen()) gen = nil // release for garbage collection } type intGen func() int func newEven() intGen { n := 0 return func() int { n += 2 return n } } func mapInt(g intGen, f func(int) int) intGen { return func() int { return f(g()) } } func square(i int) int { return i * i }
결론적으로 Go에는 반복자를 생성하는 여러 기술이 있지만 관용적인 접근 방식에는 메소드가 있는 클로저 또는 명명된 유형이 포함됩니다. 이들 사이의 선택은 특정 요구 사항과 장단점에 따라 달라집니다.
위 내용은 Go에서 반복자를 만드는 가장 관용적인 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!