😺
go公式に型制約の定義はあるのかの疑問についてのメモ
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