Heim  >  Artikel  >  Backend-Entwicklung  >  Go: So geben Sie eine Typbeschränkung an, bei der der Argumenttyp der Methode mit dem Typ des Empfängers übereinstimmt

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

王林
王林nach vorne
2024-02-09 16:33:08503Durchsuche

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
}

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
}

Ich versuche, eine generische Schnittstelle wie diese zu verwenden:

type Comparer[T any] interface {
    Compare(T) int
}

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
}

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
}

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
}

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

und deklarieren Sie die Methode als:

type MyInt int

func (t *MyInt) Compare(other MyInt) int {
    // implementation
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen