>  기사  >  백엔드 개발  >  공통 인터페이스를 인스턴스화하려면 any를 사용하고 구조체는 이를 구현하지 않습니다.

공통 인터페이스를 인스턴스화하려면 any를 사용하고 구조체는 이를 구현하지 않습니다.

WBOY
WBOY앞으로
2024-02-08 22:51:08965검색

공통 인터페이스를 인스턴스화하려면 any를 사용하고 구조체는 이를 구현하지 않습니다.

이 기사에서 PHP 편집자 Youzi는 범용 인터페이스를 인스턴스화하기 위해 any를 사용하는 방법을 소개하고 구조체가 이를 구현하지 않는 이유를 설명합니다. 일반 인터페이스는 코드를 작성할 때 보다 유연한 방식을 사용할 수 있게 해주는 매우 유용한 디자인 패턴입니다. 그러나 공통 인터페이스를 사용할 때 불필요한 문제를 피하기 위해 몇 가지 세부 사항에 주의를 기울여야 합니다. any를 사용하여 일반 인터페이스를 올바르게 인스턴스화하는 방법을 살펴보고 구조체가 이를 구현하지 않는 이유를 이해해 보겠습니다.

질문 내용

누군가 *DataTo 不满足 ToType[any]이유를 설명해 줄 수 있나요?

한 번 만들어 보세요 DTOer,将一个结构的所有值复制到另一个结构,并设置一些显式值(在本例中为 V)

https://go.dev/play/p/-oobZrw5Ewe

// You can edit this code!
// Click here and start typing.
package main

import "fmt"

type DataFrom struct {
    V1 int
}

type DataTo struct {
    V int
}

func (m *DataTo) SetVal() {
    m.V = 1
    return
}

type ToType[T any] interface {
    SetVal()
    *T
}

type DTO[TFrom any, TTo ToType[any]] struct {
    Get func(from TFrom) TTo
}

func main() {
    dto := &DTO[DataFrom, *DataTo]{
        Get: func(from DataFrom) *DataTo {
            return &DataTo{V: from.V1 + 666}
        },
    }

    vFrom := DataFrom{V1: 1}
    vTo := dto.Get(vFrom)

    fmt.Println(vTo.V)
}

Solution

becauseany은 정적 유형입니다.

이를 사용하여 ToType과 같은 일반 유형을 인스턴스화하는 경우 일반 유형은 정확히 ToType 这样的泛型类型,则该泛型类型将准确地期望 any를 예상합니다.

이제 유형 매개변수를 사용하면 이 문제를 숨길 수 있습니다. 예를 들면 다음과 같습니다.

으아악

일반적으로 위와 같이 any 指定任何类型,因为 any 只是空接口 interface{}에 대해 어떤 유형이든 지정할 수 있습니다.

는 빈 인터페이스 인터페이스{}에 대한 별칭일 뿐이고 모든 유형은 빈 인터페이스를 충족하기 때문입니다.

*T)时,使用 any 实例化意味着完全是 *any。因此,您可以将 ToType[any]복합 유형(예: *T)에 유형 매개변수가 사용되는 경우

를 사용한 인스턴스화는

정확히 *any*DataTo 显然不是 *any를 의미합니다. 따라서 ToType[any]를 같은 것으로 생각하면 됩니다. 으아악 그럼

. 자세한 내용:

인터페이스 포인터에 구조 포인터 할당

다음과 같이 구조체를 선언하면 컴파일됩니다. 🎜 으아악 🎜또는 좀 더 "일반적인" 방법이지만 더 자세한 방법도 있습니다. 🎜 으아악

위 내용은 공통 인터페이스를 인스턴스화하려면 any를 사용하고 구조체는 이를 구현하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제