> 백엔드 개발 > Golang > Go의 배열/슬라이스 공분산 부족으로 인해 다양한 컬렉션 유형을 처리하기 위한 해결 방법이 필요한 이유는 무엇입니까?

Go의 배열/슬라이스 공분산 부족으로 인해 다양한 컬렉션 유형을 처리하기 위한 해결 방법이 필요한 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-24 02:52:13
원래의
470명이 탐색했습니다.

Why Does Go's Lack of Array/Slice Covariance Require Workarounds for Handling Different Collection Types?

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에는 제네릭이 없기 때문에 모든 유형의 컬렉션을 허용하는 제네릭 printItems 함수를 정의할 수 없습니다. 대신 다음 오류가 발생합니다.

prog.go:26: cannot use iarr (type []int) as type []interface { } in function argument      
prog.go:27: cannot use farr (type []float) as type []interface { } in function argument
로그인 후 복사

인터페이스 기반 솔루션

이 제한을 극복하는 일반적인 접근 방식 중 하나는 필요한 동작을 정의하는 인터페이스를 사용하는 것입니다. 우리 컬렉션을 위해. 이 경우 At(특정 인덱스에서 항목 검색)와 Len(목록 길이 가져오기)의 두 가지 메서드를 사용하여 List 인터페이스를 정의합니다.

type List interface {
    At(i int) interface{}
    Len() int
}
로그인 후 복사

그런 다음 구체적인 구현을 만듭니다. 정수 및 부동 소수점 목록에 대한 이 인터페이스:

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 함수를 수정하여 목록을 인수로 받아들여 인쇄할 수 있습니다. 정수 및 부동 배열 모두:

import "fmt"

func printItems(header string, items List) {
    for i := 0; i < items.Len(); i++ {
        fmt.Print(items.At(i), " ")
    }
    fmt.Println()
}
로그인 후 복사

주 함수에서 정수 및 부동 목록으로 printItems를 호출하여 원하는 결과를 얻을 수 있습니다.

func main() {
    var iarr = []int{1, 2, 3}
    var farr = []float64{1.0, 2.0, 3.0}
    printItems("Integer array:", IntList(iarr))
    printItems("Float array:", FloatList(farr))
}
로그인 후 복사

인터페이스를 활용하여 컬렉션에 대한 공통 작업 세트를 정의하기 위해 Go에 제네릭이 없음에도 불구하고 어느 정도의 유연성과 코드 재사용성을 얻을 수 있습니다.

위 내용은 Go의 배열/슬라이스 공분산 부족으로 인해 다양한 컬렉션 유형을 처리하기 위한 해결 방법이 필요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿