Goには比較可能ではない型がある
- スライス
- 関数値
- 上記のものを含んだ構造体など
package main import ( "fmt" ) func main() { a := []int{1, 2, 3} b := []int{1, 2, 3} fmt.Println(a == b) }
$ go run x.go # command-line-arguments ./x.go:11:14: invalid operation: a == b (slice can only be compared to nil)
雑に使い捨てコードを書いているときにいちいちスライスの要素を一つ一つ比較する関数を書くのはめんどくさい。
無理やり比較する
package main import ( "fmt" ) func main() { a := []int{1, 2, 3} b := []int{1, 2, 3} fmt.Printf("# %q == %q\n", a, b) fmt.Println(fmt.Sprintf("%q", a) == fmt.Sprintf("%q", b)) }
go run x.go # ['\x01' '\x02' '\x03'] == ['\x01' '\x02' '\x03'] true
比較したい値をSprintfによって文字列にする。その文字列の比較によってその値が等しいかを調べてしまう。
注意点
ただのハックなのでちゃんとしたコードを書く場面では使わないほうがいいだろう。