Golang Generics의 인터페이스/구현 동시성
초기화된 값으로 슬라이스를 채우는 일반 함수를 생성하는 작업을 고려해보세요. 이것이 간단해 보일 수 있지만 인터페이스 조각을 활용하고 함수 내에서 구체적인 유형을 지정하려고 시도할 때 문제가 발생합니다.
Go 1.18에서는 X와 Y를 일반 함수 Fill 내에서 임의의 유형으로 제한하면 손실이 발생합니다. 인터페이스와 구현자 간의 모든 관계. 이는 함수 내에서 슬라이스[i]에 Y의 인스턴스를 할당하는 것을 방지합니다.
이를 극복하기 위해 명시적인 주장을 사용할 수 있습니다:
func Fill[X, Y any](slice []X) {
for i := range slice {
slice[i] = any(*new(Y)).(X)
}
}
그러나 이 접근 방식은 Y가 X를 구현하지 않을 때 패닉이 발생합니다. 또한 Y에 포인터 유형을 사용하면 기본 유형과 nil 기준 값에 대한 정보가 손실됩니다.
To 이러한 문제를 해결하려면 두 번째 유형 매개변수 대신 생성자 함수를 사용하는 것이 좋습니다.
func main() {
xs := make([]sync.Locker, 10)
Fill(xs, func() sync.Locker { return &sync.Mutex{} })
}
func Fill[X any](slice []X, f func() X) {
for i := range slice {
slice[i] = f()
}
}
이 접근 방식은 생성자 함수에 의해 생성된 초기화된 값으로 슬라이스를 효과적으로 채워 문제에 대한 보다 강력하고 유연한 솔루션을 제공합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3