😺

go公式に型制約の定義はあるのかの疑問についてのメモ

2022/08/18に公開

2022/08/18時点の話となります

概要

  • goのgenericsの紹介記事がある
  • ここでgenericsの紹介のために型制約の話が出てくる
  • 出てくるのはNumberという型制約なんですが
type Number interface {
	int64 | float64
}
  • こういう型制約が公式にあるのかという疑問を貰ったので
  • 識者に聞いたところgolang.org/x/exp/constraintsと言う物がありました
  • 標準ライブラリにはまだ無いですが拡張に存在している感じですね
    • Complex
    • Float
    • Integer
    • Ordered
    • Signed
    • Unsigned
  • 上記の6個があります。
  • そのままNumberはありませんが同様のことが出来ると思います
  • 各定義を見ると~int8といった記述がありますがこのチルダは基底型を表す演算子です

使い方

  • go getで取得するか
go get golang.org/x/exp/constraints@latest
  • importに書いてgo mod tidyを実行すれば使用出来ます
package main

import (
	"fmt"

	"golang.org/x/exp/constraints"
)

type Number interface {
	constraints.Integer | constraints.Float
}
  • 注意
    • 定義を見てもらえれば分かるんですがそのまんまNumberではないです
    • Integerの定義は以下で最初の定義とはずれています
type Signed interface {
	~int | ~int8 | ~int16 | ~int32 | ~int64
}

type Unsigned interface {
	~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr
}

type Integer interface {
	Signed | Unsigned
}

Discussion