"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > **슬라이스 초기화를 위해 Go에서 제네릭을 사용할 때 인터페이스-구현자 관계를 유지하는 방법은 무엇입니까?**

**슬라이스 초기화를 위해 Go에서 제네릭을 사용할 때 인터페이스-구현자 관계를 유지하는 방법은 무엇입니까?**

2024-11-05에 게시됨
검색:199

**How to Preserve Interface-Implementor Relationships When Using Generics in Go for Slice Initialization?**

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