https://text.baldanders.info/golang/comparability/

次のイベントに向けてネタの整理をしているところだが,その中でインスタンスの比較可能性についてきちんと整理したほうがよさそうな気がしたので,小ネタ記事として公開する。

用語の定義(暫定)

本題に入る前に,以下の2つの単語を,この記事限りの用語として定義する。 他所で使わないように(笑)

Untitled

プログラミングの世界で等値と等価に関して議論があることは知っているが,今回はまるっと無視する。 だって鬱陶しいんだもん。

比較演算子

Go 言語ではインスタンス同士の比較演算子として

の5つが定義されている。 このうち少なくとも == および != が使えることを「比較可能(comparable)」であると言う。

型の比較可能性

インスタンス同士が比較可能であるためには以下の2つの条件がが必要である。

  1. インスタンスの型が同一(等価)であること
  2. インスタンスの型が比較可能であること

たとえばある型を別の型に再定義しただけの場合でも等価とは見なされず,コンパイルエラーになる。

package main
import "fmt"
type Number int
func main() {
    var c1 int = 1
	var c2 Number = 1
	fmt.Println(c1 == c2) //compile error: mismatched types int and Number
}

ただし,等価な型にキャスト可能であれば

package main
import "fmt"
type Number int
func main() {
	var c1 int = 1
	var c2 Number = 1
	fmt.Println(c1 == int(c2)) //true
}

などとできる。 また type alias であれば等価とみなされる。

package main
import "fmt"
func main() {
	var c1 int = 1
	var c2 Number = 1
	fmt.Println(c1 == c2) //true
}