いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-208 (golang.org/x/exp/constraints)(Go 1.18 リリース時には含まれなかった制約型)

概要

忘れないうちにメモメモ。。。便利ですね。そのうち標準ライブラリに含まれるのを希望。

pkg.go.dev

サンプル

package exp_constraints

import (
    "github.com/devlights/gomy/output"
    "golang.org/x/exp/constraints"
)

type myStr string

func add[E constraints.Signed](x, y E) E {
    return x + y
}

func less[E constraints.Ordered](x, y E) bool {
    return x < y
}

// ExpConstraints -- Go 1.18 リリース時には含まれなかった制約型が定義されている golang.org/x/exp/constraints パッケージのサンプルです。
//
// REFERENCES
//   - https://pkg.go.dev/golang.org/x/exp/constraints
func ExpConstraints() error {
    //
    // constraints パッケージには、Go 1.18 リリース時には
    // 含まれなかった制約型が定義されている。
    //
    // - Complex
    // - Float
    // - Integer
    // - Ordered
    // - Signed
    // - Unsigned
    //
    // 特に Ordered は助かる。
    //
    output.Stdoutl("[Signed]", add(int32(1), int32(3)))
    output.Stdoutl("[Signed]", add(int8(1), int8(-2)))

    output.Stdoutl("[Ordered]", less(1, 2))
    output.Stdoutl("[Ordered]", less("z", "b"))
    output.Stdoutl("[Ordered]", less(myStr("b"), myStr("z")))

    return nil
}

実行すると以下のような感じです。

gitpod /workspace/try-golang (master) $ task
task: [run] go run . -onetime

ENTER EXAMPLE NAME: exp_constraints

[Name] "generics_exp_constraints"
[Signed]             4
[Signed]             -1
[Ordered]            true
[Ordered]            false
[Ordered]            true


[Elapsed] 18.251µs

過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。