Verwenden Sie „any', um eine gemeinsame Schnittstelle zu instanziieren. struct implementiert sie nicht

WBOY
Freigeben: 2024-02-08 22:51:08
nach vorne
947 Leute haben es durchsucht

Verwenden Sie „any, um eine gemeinsame Schnittstelle zu instanziieren. struct implementiert sie nicht

In diesem Artikel stellt Ihnen der PHP-Editor Youzi die Methode zur Instanziierung einer universellen Schnittstelle mit „any“ vor und erklärt, warum struct diese nicht implementiert. Generische Schnittstellen sind ein sehr nützliches Entwurfsmuster, das uns eine flexiblere Vorgehensweise beim Schreiben von Code ermöglicht. Bei der Verwendung gemeinsamer Schnittstellen müssen wir jedoch auf einige Details achten, um unnötige Probleme zu vermeiden. Werfen wir einen Blick darauf, wie man mit „any“ eine generische Schnittstelle richtig instanziiert und verstehen, warum struct sie nicht implementiert.

Frageninhalt

Kann jemand erklären, warum *DataTo 不满足 ToType[any]?

Versuchen Sie, eines zu bauen 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)
}
Nach dem Login kopieren

Lösung

weilany ein statischer Typ ist.

Wenn Sie dies verwenden, um einen generischen Typ wie ToType zu instanziieren, erwartet der generische Typ genau ToType 这样的泛型类型,则该泛型类型将准确地期望 any.

Bestimmte Verwendungen von Typparametern können dieses Problem verbergen, zum Beispiel:

type Foo[T any] struct {
    Value T
}

Foo[any]{Value: 12} // ok
Nach dem Login kopieren

Normalerweise können Sie wie oben einen beliebigen Typ für any 指定任何类型,因为 any 只是空接口 interface{} angeben, da

nur ein Alias ​​für die leere Schnittstelle interface{} ist und jeder Typ die leere Schnittstelle erfüllt.

*T)时,使用 any 实例化意味着完全是 *any。因此,您可以将 ToType[any]Wenn Typparameter für zusammengesetzte Typen verwendet werden (z. B. *T), bedeutet die Instanziierung mit

genau *any*DataTo 显然不是 *any. Sie können sich also ToType[any] als dasselbe vorstellen:

Dann

. Weitere Details:

Strukturzeiger dem Schnittstellenzeiger zuweisen

Wenn Sie die Struktur wie folgt deklarieren, wird sie kompiliert: 🎜
type DTO[TFrom any, TTo ToType[DataTo]] struct {
    Get func(from TFrom) TTo
}
Nach dem Login kopieren
🎜Oder „allgemeiner“, aber auch detaillierter: 🎜
type DTO[TFrom any, T any, TTo ToType[T]] struct {
    Get func(from TFrom) TTo
}

&DTO[DataFrom, DataTo, *DataTo]{ ... }
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonVerwenden Sie „any', um eine gemeinsame Schnittstelle zu instanziieren. struct implementiert sie nicht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!