>  기사  >  백엔드 개발  >  Go에서 슬라이스 요소 존재 여부를 일반적으로 어떻게 확인할 수 있나요?

Go에서 슬라이스 요소 존재 여부를 일반적으로 어떻게 확인할 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-28 20:00:29793검색

How Can I Check for Slice Element Presence in Go Generically?

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 if slice is valid
    if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array {
        return false
    }

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

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

성능 고려 사항

리플렉션 기반 접근 방식은 일반적이지만 유형별 비제네릭 함수에 비해 상당한 성능 저하가 발생합니다. 벤치마크에서는 50~60배의 속도 저하가 나타났습니다.

Generic: 730.23214 ns/op
Non-Generic: 13.15262 ns/op

결론

리플렉션은 슬라이스 요소 검사를 위한 일반 코드를 작성하는 방법을 제공하지만 성능 균형을 신중하게 평가하는 것이 중요합니다. . 성능이 중요한 시나리오의 경우 유형별 비일반 함수를 사용하는 것이 좋습니다.

위 내용은 Go에서 슬라이스 요소 존재 여부를 일반적으로 어떻게 확인할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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