1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Goで配列同士を比較する

Last updated at Posted at 2022-02-11

普段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.DeepEqualSlices型同士の比較ができた。
DeepEqualは、ざっくり言うと==を緩くしたもの。

a := []int{1, 2, 3}
b := []int{1, 2, 3}

fmt.Println(reflect.DeepEqual(a, b))
=> true

配列同士を比較したいと思って、調べたらいろんな事知れてよかったです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?