2016-04-12 13 views
0

Sorum ben bir dize dizisi başlatmak için kene geri kullanmak oldukça basit, ama o golang davranır farklı bu dizi bulundu:DeepEqual, arka kene ile başlatılan diziyi farklı şekilde ele alıyor?

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)) 
} 

çıktısı:

[hello world me] 
[hello world me] 
false 

Bu beni karıştı yapar : Tüm dizi dizilerinin aynı şekilde başlatıldığından emin olmalı mıyım?

cevap

5

Bunlar arrays değil slices, ve ilk dilim 2 öğeye, ikincisi 3 öğeye sahiptir, böylece nasıl eşit olabilirler?

bu gibi onları baskı deneyin:

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

Çıktı:

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

fmt.Prinln() elemanları arasında bir boşluk baskı, geçen dilim bütün değerlerini yazdırır. Ve x'un ilk elemanı, boşlukla birleştirilen y'un ilk 2 öğesine eşit olan bir dizedir, bu nedenle dilimler için eşit basılı içeriği görürsünüz. Eğer ters tırnakların ile ilk dilim başlatmak için aynı 3 dizeleri kullandığınızda

, bunlar eşit olacaktır:

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

Çıktı:

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

Go Playground bu deneyin.

+0

Teşekkürler @icza, çok detaylı bir açıklama! – harryz

+0

@harryz, onu cevap olarak işaretle! :) – eduncan911