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>
벤치마크 결과:
따라서 일반 Contains() 함수는 다양성을 제공하므로 성능 병목 현상을 방지하려면 신중하게 사용해야 합니다.
위 내용은 Go의 리플렉션 패키지를 사용하면 슬라이스에서 일반 요소 존재 여부를 확인할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!