2016-04-12 20 views
0

私の質問は、私は文字列の配列を開始するための目盛りをバック使い、非常に簡単ですが、私はそのgolang扱い異なり、この配列が見つかりました:DeepEqualはバックティックで初期化された配列を別々に扱いますか?

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

出力は次のとおりです。

[hello world me] 
[hello world me] 
false 

これは私が混乱します:すべての文字列配列が同じ方法で開始されることを確認する必要がありますか?

答えて

5

これらはarraysではなく、slicesではなく、最初のスライスには2つの要素があり、2番目の要素には3つの要素があります。

このようにそれらを印刷してみてください:

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

出力:

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

fmt.Prinln()は、要素間のスペースを印刷し、通過したスライスのすべての値を表示します。 xの最初の要素は、yの最初の2つの要素に等しい文字列で、スペースで結合されています。そのため、同じスライスの印刷内容が表示されます。

あなたがバッククォートであなたの最初のスライスを初期化するために、同じ3つの文字列を使用すると、彼らは等しくなります。

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

出力:

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

Go Playgroundにこれらを試してみてください。

+0

ありがとう@icza、非常に詳細な説明! – harryz

+0

@harryz答えとしてマークしてください! :) – eduncan911

関連する問題