2つのsliceがすべて同じ要素をもっているかどうかを比較するショートカット

  • 30
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Goでは同じサイズの配列同士の比較には==演算子が使えるが、サイズが違う配列やslice同士の比較には==が使えない。

手っ取り早く比較したいときはreflect.DeepEqualをつかうとタイプ数が少なくて便利。

package main

import (
        "fmt"
        "reflect"
)

func main() {
        a := []byte{1, 2, 3}
        b := []byte{1, 2, 3, 4}
        c := [3]byte{1, 2, 3}

        // これはコンパイルエラー
        // fmt.Println(a == b)
        // fmt.Println(a == c)

        // reflect.DeepEqual をつかうと何でも比較できる
        fmt.Println(reflect.DeepEqual(a, b))      // => false
        fmt.Println(reflect.DeepEqual(a, b[0:3])) // => true
        fmt.Println(reflect.DeepEqual(a, c))      // => false
        fmt.Println(reflect.DeepEqual(a, c[:]))   // => true
}

http://golang.org/pkg/reflect/#DeepEqual

gomegaのmatcherが使ってたのを見て知った。