>  기사  >  백엔드 개발  >  Go에서 Python의 목록 이해와 동등한 기능을 달성하는 방법은 무엇입니까?

Go에서 Python의 목록 이해와 동등한 기능을 달성하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-12 16:22:02418검색

How to Achieve Python's List Comprehension Equivalent in Go?

Go에서 Python의 목록 이해 기능과 동일

많은 개발자가 Python과 같은 다른 언어에 비해 Go에서는 겉보기에 간단한 작업을 수행하는 데 어려움을 겪고 있습니다. 그러한 작업 중 하나는 Python의 목록 이해 구문을 복제하는 것입니다.

Go에서 동일한 구성을 얻으려면 다음 접근 방식을 고려하세요.

1. "필터" 라이브러리 사용:

Rob Pike가 제안한 대로 "필터" 라이브러리는 지정된 조건을 만족하는 요소가 포함된 슬라이스를 반환하는 Choose()라는 메서드를 제공합니다. 예:

import (
    "github.com/google/go-cmp/cmp"
    "go.opencensus.io/plugin/ochttp"
    "golang.org/x/exp/slices"
)

var (
    a = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    b = []int{2, 4, 6, 8}
)

func TestChoose(t *testing.T) {
    result := ochttp.Choose(a, func(v int) bool { return v%2 == 0 })
    if !cmp.Equal(result, b) {
        t.Errorf("TestChoose() failed, got %v, want %v", result, b)
    }
}

2. For 루프 사용:

"filter"와 같은 라이브러리를 사용할 수 있음에도 불구하고 Go의 for 루프는 여전히 효율적인 대안입니다. "필터" 라이브러리용 GoDoc에서는 효율성이 중요할 때 for 루프 사용을 명시적으로 권장합니다.

3. Go Generics 사용(Go 1.18 출시 예정):

Go에 제네릭이 곧 도입되면 제네릭을 사용하여 mapreduce를 구현하는 것이 가능해집니다. 예:

func MapReduce[T, V, R any](in <-chan T, out chan<- R, mapFn func(T) V, reduceFn func(V, V) R) {

    v := make(chan V, 10)
    defer close(v)

    go func() {
        for t := range in {
            v <- mapFn(t)
        }
    }()

    r := make(chan R, 10)
    defer close(r)

    go func() {
        var acc R
        for v := range v {
            acc = reduceFn(acc, v)
        }
        r <- acc
    }()

    return <-r
}

이 구현은 T 유형의 채널을 허용하고 각 요소에 매핑 기능을 적용하며 결과를 V 유형의 채널에 저장합니다. 또 다른 고루틴은 매핑된 값의 채널을 사용하고 반복적으로 축소 함수를 적용하여 R 유형의 결과를 생성합니다. 그런 다음 결과는 R 유형의 채널로 반환됩니다.

결론:

Python의 목록 이해 구문은 다음을 제공합니다. 데이터를 변환하는 간결한 방법인 Go는 for 루프나 "필터"와 같은 라이브러리를 사용하여 효율적인 대안을 제공합니다. Go 1.18에 제네릭이 도입되면서 더욱 효율적이고 다양한 데이터 변환 메커니즘을 사용할 수 있게 되었습니다.

위 내용은 Go에서 Python의 목록 이해와 동등한 기능을 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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