Heim > Artikel > Backend-Entwicklung > Bestimmen Sie, ob zwei Scheiben in Golang gleich sind
-Tutorial-Spalte, um Ihnen vorzustellen, ob die beiden Segmente dem Array unter dem Beurteilungswert in Golang entsprechen. Ich hoffe, es wird den Freunden in Not hilfreich sein!
In Golang können wir leicht==
verwenden, um zu bestimmen, ob zwei Arrays gleich sind, aber leider gibt es für Slice keine verwandten Operatoren. Wenn zwei Arrays bestimmt werden müssen, wenn die Slices gleich sind , wir können nur eine andere Verknüpfung finden.
Die Definition der Slice-Gleichheit==
来判断两个数组(array)是否相等,但遗憾的是slice并没有相关的运算符,当需要判断两个slice是否相等时我们只能另寻捷径了。
我们选择最常见的需求,也就是当两个slice的类型和长度相同,且相等下标的值也是相等的,比如:
a := []int{1, 2, 3}b := []int{1, 2, 3}c := []int{1, 2}d := []int{1, 3, 2}
上述代码中a
和b
是相等的,c
因为长度和a
不同所以不相等,d
因为元素的排列顺序和a
不同所以也不相等。
为什么要单独将[]byte列举出来呢?
因为标准库提供了优化的比较方案,不再需要我们造轮子了:
package mainimport ( "bytes" "fmt")func main() { a := []byte{0, 1, 3, 2} b := []byte{0, 1, 3, 2} c := []byte{1, 1, 3, 2} fmt.Println(bytes.Equal(a, b)) fmt.Println(bytes.Equal(a, c))}
在判断类型不是[]byte的slice时,我们还可以借助reflect.DeepEqual
Bestimmen Sie, ob zwei []Bytes gleich sindWarum müssen wir []Byte separat auflisten? Da die Standardbibliothek ein optimiertes Vergleichsschema bietet, müssen wir das Rad nicht mehr neu erfinden:func DeepEqual(x, y interface{}) bool
a im obigen Code
undb
sind gleich,c
ist nicht gleich, da sich die Länge vona unterscheidet code> und <code>d
sind nicht gleich, da sich die Anordnungsreihenfolge der Elemente vona
unterscheidet und sie daher nicht gleich sind.
package mainimport ( "fmt" "reflect")func main() { a := []int{1, 2, 3, 4} b := []int{1, 3, 2, 4} c := []int{1, 2, 3, 4} fmt.Println(reflect.DeepEqual(a, b)) fmt.Println(reflect.DeepEqual(a, c))}
reflect.DeepEqual
zwei Objekte einschließlich der darin enthaltenen Elemente gründlich vergleichen, um zu sehen, ob sie gleich sind:
func testEq(a, b []int) bool { // If one is nil, the other must also be nil. if (a == nil) != (b == nil) { return false; } if len(a) != len(b) { return false } for i := range a { if a[i] != b[i] { return false } } return true}🎜DeepEqual meldet, ob x und y „zutiefst gleich“ sind „Zwei Werte identischen Typs sind zutiefst gleich, wenn einer der folgenden Fälle zutrifft. Werte unterschiedlicher Typen sind niemals zutiefst gleich sind wahr: Sie sind beide null oder beide ungleich null, sie haben die gleiche Länge und zeigen entweder auf denselben Anfangseintrag desselben zugrunde liegenden Arrays (d. h. &x[0] == &y[0]) oder auf ihre Entsprechende Elemente (bis zur Länge) sind zutiefst gleich. Beachten Sie, dass ein leeres Nicht-Null-Slice und ein Null-Slice (z. B. []byte{} und []byte(nil)) nicht zutiefst gleich sind.🎜🎜🎜Die Bedeutung Dieser Abschnitt ist nicht schwer zu verstehen und stimmt mit dem überein, was wir am Ende dieses Artikels besprochen haben. Das zu Beginn besprochene Prinzip zur Bestimmung der Slice-Gleichheit ist dasselbe, verwendet jedoch ein wenig „schwarze Magie“ zur Laufzeit ". 🎜🎜Sehen Sie sich das Beispiel an: 🎜
package main import "fmt" func main() { a := []int{1, 2, 3, 4} b := []int{1, 3, 2, 4} c := []int{1, 2, 3, 4} fmt.Println(testEq(a, b)) fmt.Println(testEq(a, c))}🎜🎜🎜Handschriftliche Beurteilung🎜🎜Die Verwendung von Reflect in Golang erfordert normalerweise einen Leistungsaufwand. Wenn wir den Typ des Slice bestimmen, ist es relativ nicht so mühsam, die Gleichheitsbeurteilung des Slice selbst umzusetzen : 🎜rrreee 🎜Testcode: 🎜rrreee
Das obige ist der detaillierte Inhalt vonBestimmen Sie, ob zwei Scheiben in Golang gleich sind. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!