>백엔드 개발 >Golang >Go에서 반복자를 만드는 가장 관용적인 방법은 무엇입니까?

Go에서 반복자를 만드는 가장 관용적인 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-01 17:32:14436검색

What's the Most Idiomatic Way to Create Iterators in Go?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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