Heim >Backend-Entwicklung >Golang >Sicherstellung einer strikten Vergleichbarkeit zur Kompilierungszeit in Go 1.20?

Sicherstellung einer strikten Vergleichbarkeit zur Kompilierungszeit in Go 1.20?

王林
王林nach vorne
2024-02-11 23:20:081070Durchsuche

确保 Go 1.20 中编译时的严格可比性?

php-Editor Baicao stellt Ihnen eine wichtige Funktion in der Go-Sprachversion 1.20 vor – strikte Vergleichbarkeit zur Kompilierzeit. In der Go-Sprachversion 1.20 werden neue Compiler-Flags eingeführt, um sicherzustellen, dass die während der Kompilierung generierten Binärdateien in verschiedenen Kompilierungsumgebungen vergleichbar sind. Dies bedeutet, dass unter verschiedenen Kompilierungsumgebungen generierte Binärdateien das gleiche Verhalten und die gleichen Ergebnisse aufweisen, wodurch potenzielle Probleme, die durch unterschiedliche Kompilierungsumgebungen verursacht werden, reduziert werden. Die Einführung dieser Funktion wird die Zuverlässigkeit und Stabilität der Go-Sprache weiter verbessern und Entwicklern ein besseres Entwicklungserlebnis bieten.

Frageninhalt

In Go 1.18 und Go 1.19 kann ich zur Kompilierungszeit sicherstellen, dass ein Typ streng vergleichbar ist, d. h. er unterstützt ==!= Operatoren und gerät garantiert nicht in Panik, wenn diese Operatoren ausgeführt werden .

Dies ist beispielsweise nützlich, um zu vermeiden, dass versehentlich Felder zu einer Struktur hinzugefügt werden, was unnötige Panik auslöst.

Ich habe gerade versucht, es mit

:comparable zu instanziieren

// supports == and != but comparison could panic at run time
type Foo struct {
    SomeField any
}

func ensureComparable[T comparable]() {
    // no-op
}

var _ = ensureComparable[Foo] // doesn't compile because Foo comparison may panic

Dies ist in Go 1.18 und 1.19 aufgrund der Definition von

Einschränkungen möglich: comparable

The predeclared interface type comparable denotes the set of all non-interface types that are comparable

Obwohl in den Go 1.18- und 1.19-Spezifikationen keine Typen erwähnt werden, die keine Schnittstellen sind, aber nicht streng verglichen werden können, wie z. B. [2]fmt.Stringer oder struct { foo any , gc-Kompilierung Der Compiler lehnt diese als Argumente für

ab. [2]fmt.Stringerstruct { foo any },gc 编译器确实拒绝将这些作为 comparable

Ein Spielplatz mit mehreren Beispielen: https://go.dev/play/p/_Ggfdnn6OzZ

In Go 1.20 wird die Instanziierung

im Einklang mit dem umfassenderen Konzept der Vergleichbarkeit stehen. Dadurch wird ensureComparable[Foo] kompiliert comparable 将与更广泛的可比性概念保持一致。这使得 ensureComparable[Foo], obwohl ich es nicht möchte .

Gibt es eine Möglichkeit, statisch eine strikte Vergleichbarkeit mit Go 1.20 sicherzustellen?

Problemumgehung

Um zu testen, ob Foo in Go 1.20 streng vergleichbar ist, instanziieren Sie ensureComparablemit einem

TypparameterFoo 在 Go 1.20 中是否严格可比,请使用受 Foo 约束的类型参数实例化 ensureComparable, der durch Foo > eingeschränkt wird.

// unchanged
type Foo struct {
    SomeField any
}

// unchanged
func ensureComparable[T comparable]() {}

// T constrained by Foo, instantiate ensureComparable with T
func ensureStrictlyComparable[T Foo]() {
    _ = ensureComparable[T] // <---- doesn't compile
}

Diese Lösung wurde ursprünglich von Robert Griesemer hier vorgeschlagen a>.

Wie funktioniert es?

Go 1.20 führt implementiertSchnittstellen ein und erfüllt Einschränkungen:

Der zweite Punkt besteht darin, Ausnahmen für die Instanziierung von Schnittstellen und Typen mit Schnittstellen zuzulassen comparable .

In Go 1.20 kann nun der Typ Foo selbst instanziiert werden Foo 本身可以实例化 comparable 。但类型参数 T 不是 Foo aufgrund von Erfüllbarkeitsausnahmen. Aber der Typparameter T ist nicht Foo. Kompatibilitätsdefinitionen für Typparameter unterscheiden sich :

Ts Typsatz enthält einen Typ Foo, der nicht streng vergleichbar ist (da er ein Schnittstellenfeld hat), sodass T nicht erfüllt T 的类型集包含一个不严格可比的类型 Foo (因为它有一个接口字段),因此 T 不满足 comparable。即使 Foo. Dies gilt sogar für Foo selbst.

Dieser Trick führt effektiv dazu, dass das Programm nicht kompiliert werden kann, wenn der Operator von Foo Foo 的运算符 ==!= zur Laufzeit in Panik geraten könnte.

Das obige ist der detaillierte Inhalt vonSicherstellung einer strikten Vergleichbarkeit zur Kompilierungszeit in Go 1.20?. 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