普段Rubyを書いてるんですが、最近Goに興味が出てきました。
Goの配列同士を比較する時どうするのか調べたので、記事にする。
Rubyだったらこんな感じで配列同士を比較できます。
a = [1, 2, 3]
b = [1, 2, 3]
a == b
=> true
Goでも下記のように書くと比較できる。
a := [3]int{1, 2, 3}
b := [3]int{1, 2, 3}
fmt.Println(a == b)
=> true
ただこれだとエラーになる。
a := []int{1, 2, 3}
b := []int{1, 2, 3}
fmt.Println(a == b)
=> invalid operation: a == b (slice can only be compared to nil)
調べてみると、
Goにおける配列(Array)は同じ型の値の集まりです。
さらに、配列の長さはその型の一部であるため配列のサイズを変更することはできません。
じゃあ自分が配列だと思っていたa := []int{1, 2, 3}
はなんだったのか。
↓
Slices
型だった。
配列は長さが固定されてるけど、Slices
型は可変長でより柔軟な配列を表現できる。
Slices
型の方がArray型よりもよく使われるみたい。
じゃあなんでSlices
型同士を比較するとエラーが出たのか?
リファレンスを確認すると、比較演算子はSlices
同士を比較できないようだった。
https://go.dev/ref/spec#Comparison_operators
他に方法はないかと思って調べると、reflect.DeepEqual
でSlices
型同士の比較ができた。
DeepEqual
は、ざっくり言うと==
を緩くしたもの。
a := []int{1, 2, 3}
b := []int{1, 2, 3}
fmt.Println(reflect.DeepEqual(a, b))
=> true
配列同士を比較したいと思って、調べたらいろんな事知れてよかったです。