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

WBOY
リリース: 2024-02-08 22:51:08
転載
947 人が閲覧しました

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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!