인터페이스를 활용하여 Go의 배열/슬라이스 공분산 제한 극복
Go 프로그래밍 언어에 내재된 제네릭 부족으로 인해 작업 시 문제가 발생할 수 있습니다. 다양한 유형의 데이터 컬렉션을 통해 []인터페이스{}와 같은 일반 컬렉션 유형을 기대하는 함수에 다양한 요소 유형의 배열이나 슬라이스를 전달하려고 할 때 한 가지 특정한 문제가 발생합니다.
다음 코드 조각을 고려하세요.
func printItems(header string, items []interface{}, fmtString string) { // ... } func main() { var iarr = []int{1, 2, 3} var farr = []float{1.0, 2.0, 3.0} printItems("Integer array:", iarr, "") printItems("Float array:", farr, "") }
이 시나리오에서는 Go가 호환되지 않는 요소 유형이 있는 컬렉션을 함수에 인수로 전달하는 것을 금지하기 때문에 코드가 컴파일되지 않습니다. 이러한 제한을 피하기 위해 인터페이스 기반의 대체 접근 방식을 사용할 수 있습니다.
해결책: 인터페이스 수용
Go의 인터페이스는 다음과 같은 메서드 집합을 정의하는 수단을 제공합니다. 유형이 구현되어야 합니다. 컬렉션 액세스 및 관리를 위한 필수 작업을 캡슐화하는 인터페이스를 생성하면 다양한 유형의 컬렉션을 일반적인 방식으로 작업하는 것이 가능해집니다.
다음 수정된 코드 조각에서 List 인터페이스가 정의됩니다.
type List interface { At(i int) interface{} Len() int }
이 인터페이스는 컬렉션 색인을 생성하는 At와 컬렉션 길이를 검색하는 Len이라는 두 가지 메서드를 지정합니다. 이어서 정수 및 부동 소수점 목록에 대한 별도의 유형이 정의되고 각각은 List 인터페이스를 구현합니다.
type IntList []int type FloatList []float64 func (il IntList) At(i int) interface{} { return il[i] } func (fl FloatList) At(i int) interface{} { return fl[i] } func (il IntList) Len() int { return len(il) } func (fl FloatList) Len() int { return len(fl) }
마지막으로 printItems 함수는 List 매개변수를 허용하도록 업데이트될 수 있습니다.
func printItems(header string, items List) { for i := 0; i < items.Len(); i++ { fmt.Print(items.At(i), " ") } fmt.Println() }
이 접근 방식은 인터페이스를 활용하여 기본 컬렉션 유형을 추상화하여 이 예에서 정수 배열과 부동 소수점 배열을 모두 일반적으로 처리할 수 있도록 합니다. 컬렉션에 액세스하고 관리하는 데 필요한 메서드를 정의하면 일관된 방식으로 컬렉션과 상호 작용하는 것이 가능해집니다.
Go에서는 제네릭이 실제로 이러한 시나리오를 단순화하지만 인터페이스 활용은 실행 가능한 대체 솔루션 역할을 합니다. , 프로그래머가 다양한 유형의 컬렉션을 사용하여 효과적으로 작업할 수 있습니다.
위 내용은 인터페이스는 Go의 배열/슬라이스 공분산 제한을 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!