Heim > Backend-Entwicklung > Golang > Bestimmen Sie, ob zwei Scheiben in Golang gleich sind

Bestimmen Sie, ob zwei Scheiben in Golang gleich sind

藏色散人
Freigeben: 2021-04-02 15:13:09
nach vorne
2330 Leute haben es durchsucht

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

Bestimmen Sie, ob zwei Scheiben in Golang gleich sind

Die Definition der Slice-Gleichheit==来判断两个数组(array)是否相等,但遗憾的是slice并没有相关的运算符,当需要判断两个slice是否相等时我们只能另寻捷径了。

slice相等的定义

我们选择最常见的需求,也就是当两个slice的类型和长度相同,且相等下标的值也是相等的,比如:

a := []int{1, 2, 3}b := []int{1, 2, 3}c := []int{1, 2}d := []int{1, 3, 2}
Nach dem Login kopieren

上述代码中ab是相等的,c因为长度和a不同所以不相等,d因为元素的排列顺序和a不同所以也不相等。

判断两个[]byte是否相等

为什么要单独将[]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))}
Nach dem Login kopieren

使用reflect判断slice(数组)是否相等

在判断类型不是[]byte的slice时,我们还可以借助reflect.DeepEqual

Wir wählen die häufigste Anforderung, dh wenn die Art und Länge der beiden Slices gleich sind und auch die Werte der gleichen Indizes gleich sind, wie zum Beispiel:
func DeepEqual(x, y interface{}) bool
Nach dem Login kopieren

a im obigen Code und b sind gleich, c ist nicht gleich, da sich die Länge von a unterscheidet code> und <code>d sind nicht gleich, da sich die Anordnungsreihenfolge der Elemente von a unterscheidet und sie daher nicht gleich sind.

Bestimmen Sie, ob zwei []Bytes gleich sind

Warum müssen wir []Byte separat auflisten?

Da die Standardbibliothek ein optimiertes Vergleichsschema bietet, müssen wir das Rad nicht mehr neu erfinden:

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))}
Nach dem Login kopieren

Verwenden Sie Reflect, um festzustellen, ob Slices (Arrays) gleich sind

Bei der Beurteilung von Slices, deren Typ nicht []Byte ist, Wir können auch mit 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}
Nach dem Login kopieren
🎜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))}
Nach dem Login kopieren
🎜🎜🎜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!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage