2016-04-12 2 views
0

Meine Frage ist ganz einfach, ich tick verwenden wieder ein String-Array zu starten, aber ich fand das anders Array, das golang behandelt:DeepEqual behandelt Array initialisiert mit Back Tick anders?

import (
    "fmt" 
    "reflect" 
) 

func main() { 
    x := []string{`hello world`, "me"} 
    y := []string{"hello", "world", "me"} 
    fmt.Println(x) 
    fmt.Println(y) 
    fmt.Println(reflect.DeepEqual(x, y)) 
} 

Die Ausgabe lautet:

[hello world me] 
[hello world me] 
false 

Das macht mich verwirrt : Soll ich sicherstellen, dass alle String-Arrays auf die gleiche Weise initiiert werden?

Antwort

5

Das sind slices, nicht arrays, und Ihre erste Scheibe hat 2 Elemente, und die zweite hat 3 Elemente, also wie könnten sie gleich sein?

Versuchen sie so den Druck:

fmt.Printf("%d %q\n", len(x), x) 
fmt.Printf("%d %q\n", len(y), y) 

Ausgang:

2 ["hello world" "me"] 
3 ["hello" "world" "me"] 

fmt.Prinln() werden alle Werte des übergebenen Scheibe gedruckt werden, um einen Raum zwischen den Elementen zu drucken. Und das erste Element x ist eine Zeichenkette, die den ersten beiden Elementen von y zusammen mit einem Leerzeichen entspricht, deshalb sehen Sie den gleichen gedruckten Inhalt für die Slices.

Wenn Sie die gleichen drei Saiten verwenden, um Ihre erste Scheibe mit Backticks zu initialisieren, werden sie gleich:

x = []string{`hello`, `world`, "me"} 
y = []string{"hello", "world", "me"} 
fmt.Printf("%d %q\n", len(x), x) 
fmt.Printf("%d %q\n", len(y), y) 
fmt.Println(reflect.DeepEqual(x, y)) 

Ausgang:

3 ["hello" "world" "me"] 
3 ["hello" "world" "me"] 
true 

diese Versuchen Sie, auf die Go Playground.

+0

Dank @icza, sehr detaillierte Erklärung! – harryz

+0

@harryz so markieren Sie ihn als Antwort! :) – eduncan911

Verwandte Themen