>백엔드 개발 >Golang >Go의 리플렉션 패키지를 사용하면 슬라이스에서 일반 요소 존재 여부를 확인할 수 있나요?

Go의 리플렉션 패키지를 사용하면 슬라이스에서 일반 요소 존재 여부를 확인할 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-11-03 09:53:29820검색

Can Go's Reflection Package Enable Generic Element Presence Checks in Slices?

Go 슬라이스의 요소 존재 여부를 확인하기 위해 일반 코드를 구현할 수 있습니까?

Go에서는 슬라이스에 특정 요소가 포함되어 있는지 확인하는 것이 일반적인 작동. 그러나 모든 새로운 슬라이스 유형에 대해 이 논리를 구현하는 것은 지루해 보일 수 있습니다.

코드 조각에서 볼 수 있듯이 인터페이스{} 슬라이스를 사용하는 방법을 시도했습니다.

<code class="go">func sliceContains(slice []interface{}, elem interface{}) bool {
    for _, item := range slice {
       if item == elem {
          return true
       }
    }
    return false
}</code>

그러나 이 접근 방식은 인터페이스{}의 특성과 각각의 새로운 슬라이스 유형에 대해 이를 구현해야 하는 요구 사항으로 인해 방해를 받습니다.

다행히 Go의 리플렉션 패키지는 일반적인 솔루션을 제공합니다.

<code class="go">func Contains(slice, elem interface{}) bool {

    sv := reflect.ValueOf(slice)

    // Check slice type.
    if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array {
        return false
    }

    // Iterate slice and compare elements.
    for i := 0; i < sv.Len(); i++ {
        if elem == sv.Index(i).Interface() {
            return true
        }
    }

    // Element not found.
    return false
}</code>

이 함수 두 개의 매개변수, 즉 슬라이스와 찾을 요소를 사용합니다. 리플렉션을 사용하여 슬라이스가 슬라이스인지 배열인지 확인한 다음 ValueOf() 및 Index() 메서드를 사용하여 해당 요소를 반복합니다.

이 일반적인 접근 방식은 편리하지만 다음과 같은 비용이 듭니다. 성능. 벤치마크에서는 아래와 같이 일반 버전이 아닌 버전보다 50~60배 느릴 수 있음을 보여줍니다.

<code class="go">func ContainsNonGeneic(slice []int, elem int) bool {
    for _, i := range slice {
        if i == elem {
            return true
        }
    }
    return false
}</code>

벤치마크 결과:

  • 일반: N=100000, 73.023214ms, 730.23214 ns/op
  • 비일반: N=100000, 1.315262ms, 13.15262 ns/op

따라서 일반 Contains() 함수는 다양성을 제공하므로 성능 병목 현상을 방지하려면 신중하게 사용해야 합니다.

위 내용은 Go의 리플렉션 패키지를 사용하면 슬라이스에서 일반 요소 존재 여부를 확인할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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