ホームページ  >  記事  >  バックエンド開発  >  any を使用して共通インターフェイスをインスタンス化します。構造体はそれを実装しません

any を使用して共通インターフェイスをインスタンス化します。構造体はそれを実装しません

WBOY
WBOY転載
2024-02-08 22:51:08965ブラウズ

any を使用して共通インターフェイスをインスタンス化します。構造体はそれを実装しません

#php エディターの Youzi が、any を使用してユニバーサル インターフェイスをインスタンス化する方法を紹介し、struct がそれを実装しない理由を説明します。ジェネリック インターフェイスは、コードを記述するときにより柔軟な方法を使用できるようにする非常に便利なデザイン パターンです。ただし、共通のインターフェイスを使用する場合は、不要な問題を避けるためにいくつかの詳細に注意を払う必要があります。 any を使用して汎用インターフェイスを適切にインスタンス化する方法を見て、構造体がそれを実装しない理由を理解しましょう。

質問内容

*DataToToType[any] を満たさない理由を誰か説明できますか?

すべての値をある構造体から別の構造体にコピーし、いくつかの明示的な値 (この場合は V) を設定する DTOer を構築してみます。

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)
}

解決策

anyは静的型であるためです。

これを使用して

ToType のようなジェネリック型をインスタンス化する場合、ジェネリック型は正確に any を想定します。

現在、型パラメータの特定の使用法では、この問題が隠れている可能性があります。例:

リーリー

通常、

any は空のインターフェース interface{} のエイリアスであり、任意の型 All であるため、上記のように any に任意の型を指定できます。空のインターフェイスを満たします。

type パラメータが複合型 (例:

*T) に使用される場合、any を使用したインスタンス化は、 正確に *any## を意味します。 。したがって、ToType[any] は同じものと考えることができます: リーリー したがって、

*DataTo

は明らかに *any ではありません。詳細: 構造体ポインタをインターフェイス ポインタに割り当てる 構造体を次のように宣言すると、コンパイルされます:

リーリー

または、より「一般的」かつより詳細な方法:

リーリー

以上がany を使用して共通インターフェイスをインスタンス化します。構造体はそれを実装しませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。