Unengineered Weblog

PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND

Goでスライスなどを無理やり比較する

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によって文字列にする。その文字列の比較によってその値が等しいかを調べてしまう。

注意点

ただのハックなのでちゃんとしたコードを書く場面では使わないほうがいいだろう。