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
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.
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?
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
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
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
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!