Go: So geben Sie eine Typbeschränkung an, bei der der Argumenttyp der Methode mit dem Typ des Empfängers übereinstimmt

王林
Freigeben: 2024-02-09 16:33:08
nach vorne
441 Leute haben es durchsucht

Go: So geben Sie eine Typbeschränkung an, bei der der Argumenttyp der Methode mit dem Typ des Empfängers übereinstimmt

In der Go-Sprache können wir Typeinschränkungen verwenden, um die Parametertypen von Funktionen oder Methoden anzugeben. Wenn wir möchten, dass der Parametertyp einer Methode mit dem Empfängertyp identisch ist, wie geben wir ihn an? Zunächst muss klar sein, dass die Go-Sprache die Funktion, dass der Parametertyp mit dem Empfängertyp übereinstimmt, nicht direkt unterstützt. Allerdings können wir einen ähnlichen Effekt erzielen, indem wir Zeigertypen in Methodendefinitionen verwenden. Als Nächstes erfahren Sie, wie Sie den Parametertyp so festlegen, dass er mit dem Empfängertyp in der Go-Sprache übereinstimmt.

Frageninhalt

Ich möchte eine Typbeschränkung wie unten gezeigt angeben:

type Comparer interface {
    Compare(another Comparer) int
}
Nach dem Login kopieren

Aber ich möchte, dass der Implementierungstyp seinen eigenen konkreten Typ an die Methode übergibt Compare 而不是接口 Comparer 中,如下所示(我知道以下没有实现 Comparer):

func (a MyInt) Compare(b MyInt) int {
    xxxx
    return xxxx
}
Nach dem Login kopieren

Ich versuche, eine generische Schnittstelle wie diese zu verwenden:

type Comparer[T any] interface {
    Compare(T) int
}
Nach dem Login kopieren
Nach dem Login kopieren

Aber das zwingt den Empfänger der Methode Compare nicht dazu, ebenfalls vom Typ T zu sein.

Gibt es eine Möglichkeit, zu erzwingen, dass der Empfängertyp und der Parametertyp einer Methode Compare gleich sind?

Workaround

Wenn Sie von Einschränkungen sprechen, beziehen Sie sich im Wesentlichen auf eine bestimmte Verwendung eines Schnittstellentyps als Einschränkung des Satzes von Typparametern.

Wenn Sie die Schnittstelle also (richtig) definieren als:

type Comparer[T any] interface {
    Compare(T) int
}
Nach dem Login kopieren
Nach dem Login kopieren

Du erzählst nur die halbe Geschichte. Tatsächlich stellt das oben Genannte keine Einschränkung dar. Es ist nur eine Schnittstelle.

Um wirklich eine Typbeschränkung zu sein, muss die Schnittstelle als solche verwendet werden.

func Foo[T Comparer[T]](t1, t2 T) int {
    return t1.Compare(t2)
}

type Thing[T Comparer[T]] struct {
    Value T
}
Nach dem Login kopieren

Nur innerhalb einer Typparameterliste können Sie

sich selbst erzwingen, indem Sie die Einschränkung mit ihren Typparametern instanziieren. Compare(T) 的接收者为 T

Wenn eine Schnittstelle nicht als Einschränkung verwendet wird, ist sie lediglich eine Definition einer Reihe von Methoden,

beabsichtigt ohne Einschränkungen hinsichtlich der Typen, die sie implementieren können.

<小时>Sie können jetzt Typbegriffe verwenden, um anzugeben, welche Typen eine bestimmte Schnittstelle implementieren müssen. Typparameter können jedoch nicht direkt als Typbegriffe verwendet werden. Sie müssen einen unbenannten Typ verwenden, beispielsweise einen Zeiger auf

: T

type Comparer[T any] interface {
    *T
    Compare(T) int
}
Nach dem Login kopieren

Beachten Sie, dass Sie dadurch gezwungen werden, die Methode auf dem Zeigerempfänger zu deklarieren, z. B.

, was möglicherweise ideal ist. *MyInt

Trotzdem kann dies nicht als T Comparer[T] mit seinen eigenen Typparametern instanziiert werden, da die Einschränkung eine zusätzliche Ebene der Zeigerindirektion erzwingen würde, egal was

ist. Funktionsparameter erfüllen dies niemals. T Comparer[T] 因为无论 T

Der Trick, diese Funktionalität zu erreichen, besteht darin, sie

mit verschiedenen Typparametern zu instanziieren. Comparer

func test[T any, V Comparer[T]](a, b T) int {
    return V(&a).Compare(b)
}
Nach dem Login kopieren

und deklarieren Sie die Methode als:

type MyInt int

func (t *MyInt) Compare(other MyInt) int {
    // implementation
}
Nach dem Login kopieren
Wenn Sie Schnittstelleneinschränkungen jedoch wie vorgesehen verwenden, wird dieser komplizierte Workaround völlig überflüssig.

Spielplatz

https://www.php.cn/link/3ea816621e0d8ecd5e534ec28051d4d5

Das obige ist der detaillierte Inhalt vonGo: So geben Sie eine Typbeschränkung an, bei der der Argumenttyp der Methode mit dem Typ des Empfängers übereinstimmt. 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!