"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go의 기능보다 범위

Go의 기능보다 범위

2024-08-29에 게시됨
검색:930

range-over-func in Go

Go1.23에서는 go1.22에서 실험한 기능인 range-over-func 기능을 실제로 사용하게 되었습니다. 잠시 명상을 해보세요. 그러지 마세요. P'Yod는

를 읽을 수 있도록 매우 간단한 방법으로 설명합니다.

범위 절이 있는 For 문의 사양부터 3가지 유형의 표현식이 추가되었습니다.

func(func() bool)
func(func(V) bool)
func(func(K, V) bool)

다음과 같이 설명하기 위해 하나의 변수를 추가하고 싶습니다.

f func(yield func() bool)
f func(yield func(V) bool)
f func(yield func(K, V) bool)

스펙에 따르면 f 함수를 분노 표현으로 사용할 때 함수 f를 완료하기 전에 거기에서 항복 함수를 호출할 때마다 각 루프에서 결과를 얻습니다. 우리가 수익률에 삽입한 값과 같습니다. 설명할 때에도 여전히 혼란스럽습니다. 더 나은 코드 작성

func main() {
    for range loop {
        fmt.Println("-")
    }
}

func loop(yield func() bool) {
    yield()
    yield()
}

산출:

-
-

이와 같은 코드를 작성하면 사양에 따라 f에서 Yield를 2번 호출하기 때문에 2개의 완전한 루프를 얻게 됩니다. 여기서는 루프라는 이름을 지정하고 아무 것도 반환하지 않습니다. 어떤 인수도 허용하지 않는 수익률이 있는 패턴을 사용하기로 선택했기 때문입니다.

또 다른 예

func main() {
    for i := range loop {
        fmt.Println(i)
    }
}

func loop(yield func(int) bool) {
    yield(3)
    yield(7)
}

산출:

3
7

이 방법으로 우리는 Yield를 한 번 호출하고 이제 range는 매번 Yield를 호출하는 데 사용하는 2개의 값인 3과 7을 반환하기 때문에 2라운드도 얻게 됩니다.

또 다른 예

func main() {
    for i := range loop {
        fmt.Println(i)
    }
}

func Loop(yield func(int, string) bool) {
    yield(3, "three")
    yield(5, "five")
    yield(7, "seven")
}

산출:

3 three
5 five
7 seven

우리는 매번 산출량에 넣은 것에 따라 3개의 루프를 얻고 루프당 2개의 값을 얻습니다.
또한
와 같은 모든 유형의 인수를 삽입하여 항복을 호출할 수도 있습니다.

func loop(yield func(string, bool) bool) {
    yield("three", true)
    yield("five", false)
    yield("seven", false)
}

이제 우리는 그 메커니즘을 이해했습니다. 어려운 예제를 읽으면 Go Wiki: Rangefunc Experiment
의 예제와 같이 더 많은 것을 이해하게 됩니다.

package slices

func Backward[E any](s []E) func(func(int, E) bool) {
    return func(yield func(int, E) bool) {
        for i := len(s)-1; i >= 0; i-- {
            if !yield(i, s[i]) {
                return
            }
        }
    }
}

기본

s := []string{"hello", "world"}
for i, x := range slices.Backward(s) {
    fmt.Println(i, x)
}

읽기가 훨씬 더 쉽죠? 결국, 이를 어떻게 적용할지는 귀하에게 달려 있습니다. 우리는 Yield가 몇 번 호출되는지만 살펴봅니다. 범위 안에 넣었을 때만 얻을 수 있습니다.
나오는 값은 수익률에 들어간 값입니다.

릴리스 선언문 이 기사는 https://dev.to/pallat/range-over-func-in-go-of?1에서 재현됩니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3