#php エディターの Youzi が、any を使用してユニバーサル インターフェイスをインスタンス化する方法を紹介し、struct がそれを実装しない理由を説明します。ジェネリック インターフェイスは、コードを記述するときにより柔軟な方法を使用できるようにする非常に便利なデザイン パターンです。ただし、共通のインターフェイスを使用する場合は、不要な問題を避けるためにいくつかの詳細に注意を払う必要があります。 any を使用して汎用インターフェイスを適切にインスタンス化する方法を見て、構造体がそれを実装しない理由を理解しましょう。
*DataTo
が ToType[any]
を満たさない理由を誰か説明できますか?
すべての値をある構造体から別の構造体にコピーし、いくつかの明示的な値 (この場合は V
) を設定する DTOer
を構築してみます。
// 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) }解決策
anyは静的型であるためです。
ToType のようなジェネリック型をインスタンス化する場合、ジェネリック型は正確に
any を想定します。
リーリー
通常、any は空のインターフェース
interface{} のエイリアスであり、任意の型 All であるため、上記のように
any に任意の型を指定できます。空のインターフェイスを満たします。
*T) に使用される場合、
any を使用したインスタンス化は、
正確に *any## を意味します。 。したがって、
ToType[any] は同じものと考えることができます:
リーリー
したがって、
は明らかに *any
ではありません。詳細: 構造体ポインタをインターフェイス ポインタに割り当てる
構造体を次のように宣言すると、コンパイルされます:
または、より「一般的」かつより詳細な方法:
リーリー以上がany を使用して共通インターフェイスをインスタンス化します。構造体はそれを実装しませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。