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 중국어 웹사이트의 기타 관련 기사를 참조하세요!