>  기사  >  백엔드 개발  >  Go에서 다양한 유형의 슬라이스에 요소 존재 여부를 어떻게 확인하나요?

Go에서 다양한 유형의 슬라이스에 요소 존재 여부를 어떻게 확인하나요?

Linda Hamilton
Linda Hamilton원래의
2024-11-02 03:11:30275검색

How do you check for element presence in slices of different types in Go?

Go에서 슬라이스의 요소 존재 여부를 일반적으로 확인하는 방법

Go에서 슬라이스에 특정 요소가 포함되어 있는지 확인하는 것은 일반적인 시나리오. 그러나 다양한 슬라이스 유형에 걸쳐 이 일반 검사를 수행하는 기본 제공 방법은 없습니다.

인터페이스를 사용한 시도 실패{}

인터페이스 사용 시도{ } 유형을 아래와 같이 일반적인 솔루션으로 사용하는 것이 그럴듯해 보일 수 있습니다.

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

그러나 서로 다른 유형(인터페이스{})의 값을 비교하면 잘못된 결과가 발생할 수 있습니다.

리플렉션을 사용한 일반 솔루션

진정한 일반 솔루션을 얻으려면 리플렉션을 사용할 수 있습니다. 다음 함수는 리플렉션을 사용하여 슬라이스를 반복하고 각 요소를 대상 요소와 비교합니다.

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

    sv := reflect.ValueOf(slice)

    // Check that slice is actually a slice/array.
    if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array {
        return false
    }

    // Iterate the slice
    for i := 0; i < sv.Len(); i++ {

        // Compare elem to the current slice element
        if elem == sv.Index(i).Interface() {
            return true
        }
    }

    // Nothing found
    return false
}</code>

이 솔루션을 사용하면 모든 유형의 슬라이스에 대해 일반 요소 검사를 수행할 수 있습니다.

성능 고려 사항

일반 Contains 함수는 원하는 기능을 제공하지만 상당한 성능 비용이 발생합니다. 제네릭이 아닌 등가 함수에 대한 벤치마킹은 약 50배의 속도 저하 요인을 생성합니다. 따라서 일반 요소 검사에 리플렉션을 사용하기 전에 성능에 미치는 영향을 평가하는 것이 중요합니다.

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

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