이 기사에서 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) }
becauseany
은 정적 유형입니다.
이를 사용하여 ToType
과 같은 일반 유형을 인스턴스화하는 경우 일반 유형은 정확히 ToType
这样的泛型类型,则该泛型类型将准确地期望 any
를 예상합니다.
이제 유형 매개변수를 사용하면 이 문제를 숨길 수 있습니다. 예를 들면 다음과 같습니다.
으아악일반적으로 위와 같이 any
指定任何类型,因为 any
只是空接口 interface{}
에 대해 어떤 유형이든 지정할 수 있습니다.
인터페이스{}
에 대한 별칭일 뿐이고 모든 유형은 빈 인터페이스를 충족하기 때문입니다.
*T
)时,使用 any
实例化意味着完全是 *any
。因此,您可以将 ToType[any]
복합 유형(예: *T
)에 유형 매개변수가 사용되는 경우
정확히 *any
*DataTo
显然不是 *any
를 의미합니다. 따라서 ToType[any]
를 같은 것으로 생각하면 됩니다.
으아악
그럼
인터페이스 포인터에 구조 포인터 할당
다음과 같이 구조체를 선언하면 컴파일됩니다. 🎜 으아악 🎜또는 좀 더 "일반적인" 방법이지만 더 자세한 방법도 있습니다. 🎜 으아악
위 내용은 공통 인터페이스를 인스턴스화하려면 any를 사용하고 구조체는 이를 구현하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!