Heim >Backend-Entwicklung >Golang >Sicherstellung einer strikten Vergleichbarkeit zur Kompilierungszeit in 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.
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 .
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 panicDies 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 comparableObwohl 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.Stringer
或 struct { foo any }
,gc 编译器确实拒绝将这些作为 comparable
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 .
Foo
in Go 1.20 streng vergleichbar ist, instanziieren Sie ensureComparable
mit 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 :
T
s 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!