>백엔드 개발 >Golang >Go의 배열/슬라이스 공분산 제한을 어떻게 효율적으로 처리할 수 있나요?

Go의 배열/슬라이스 공분산 제한을 어떻게 효율적으로 처리할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-14 21:32:15289검색

How Can We Efficiently Handle Go's Array/Slice Covariance Limitations?

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의 엄격한 입력 시스템으로 인해 이 코드는 컴파일 오류와 함께 실패합니다.

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

정교한 솔루션: 인터페이스 수용

이러한 한계를 극복하는 우아한 방법은 Go의 강력한 인터페이스 시스템을 활용하는 것입니다. 배열과 같은 컬렉션의 필수 속성을 캡슐화하는 인터페이스를 정의함으로써 일반적인 솔루션을 만들 수 있습니다.

type List interface {
    At(i int) interface{}
    Len() int
}

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

유형별 구현

각각에 대해 구체적인 유형에서는 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) }

예 사용법

일반 코드를 사용하기 위해 구체적인 배열을 사용자 정의 유형으로 래핑합니다.

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

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