>백엔드 개발 >Golang >Go에서 반복자를 어떻게 관용적으로 구현할 수 있나요?

Go에서 반복자를 어떻게 관용적으로 구현할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-12-02 04:48:13447검색

How Can I Idiomatically Implement Iterators in Go?

Go에 관용적 반복자 구현이 있나요?

반복자를 연상시키는 채널은 range 키워드를 통해 반복을 제공합니다. 그러나 고루틴 누수를 생성하지 않고 이러한 루프를 벗어날 수 없기 때문에 유용성이 제한됩니다. 좀 더 관용적인 반복자 패턴을 찾기 위해 개발자들은 맵, 필터, 축소와 같은 연산자를 사용하여 명시적으로 반복하고 반복자를 결합하는 방법에 대해 질문을 제기했습니다.

클로저 기반 접근 방식

채널이 편리함에도 불구하고 클로저가 더 적합한 경우가 많습니다. 클로저를 사용하면 순차적인 방식으로 값을 생성하는 반복자를 생성할 수 있습니다. 다음은 클로저를 사용하여 짝수에 대한 반복자를 생성하는 예입니다:

func newEven() func() int {
    n := 0
    return func() int {
        n += 2
        return n
    }
}

메서드 기반 접근 방식

클로저가 마음에 들지 않으면 다음을 수행할 수 있습니다. 메소드로 명명된 유형을 사용합니다:

type even int

func (e *even) next() int {
    *e += 2
    return int(*e)
}

절충점 및 연결

클로저와 방법 사이의 선택에는 절충이 필요합니다. 클로저는 더 유연하고 메소드는 더 명시적인 구조를 제공합니다.

Go에서는 함수의 최고 수준 특성 덕분에 연결이 간단합니다. 다음 예에서는 제곱 함수를 사용하여 짝수 생성기를 연결하는 방법을 보여줍니다.

func mapInt(g intGen, f func(int) int) intGen {
    return func() int {
        return f(g())
    }
}

func square(i int) int {
    return i * i
}

위 내용은 Go에서 반복자를 어떻게 관용적으로 구현할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.