🐣

Go で適当なシリアルナンバーを生成できるパッケージを作った

4 min read

なぜ作ったのか

趣味で開発しているツールの仕様に、 一定のルールに基づいて ID を生成する という機能があったので、その実装をパッケージとして切り出してみました。

https://github.com/kenkyu392/go-sn
  • 連番を設定してくれる
  • 単語などのリストを使用できる
  • 人間が読める(human-readable) ID も生成できる

初動ではこれぐらいしか考えていなかったので、とりあえず生成ルールをカスタムできる設計ならいいかな。ぐらいの気持ちで作りました。

使い方

使い方は rule.Rule を設定した sn.Generator を作成して String メソッドを呼び出すだけです。この Rule については詳しく後述します。

package main

import (
	"fmt"

	"github.com/kenkyu392/go-sn"
	"github.com/kenkyu392/go-sn/rule"
)

func main() {
	// ジェネレータを作成する
	g := sn.NewGenerator(
		// アルファベット (a-zA-Z)
		rule.RandomAlphabet(4),
		// 数字 (0-9)
		rule.RandomNumeric(4),
		// アルファベット & 数字 (a-zA-Z0-9)
		rule.RandomAlphabetAndNumeric(4),
		// 0パディング付きの連番
		rule.NumberingWithPadding(4),
	)
	for i := 0; i < 5; i++ {
		// 生成する
		fmt.Println(g.String())
	}
}

このコードの実行結果はこのようになります。

tkaZ-9232-V1O4-0000
BlGE-1371-2Yz5-0001
nhoJ-2399-ecHE-0002
pECW-7494-52n7-0003
ZpxT-3040-DOKd-0004

ジェネレータの区切り文字を変更する

区切り文字は sn.Generator.Delimiter に好きな文字列を設定するだけで変更できます。
csv.Writer.Comma のように rune 型にしようと思いましたが、今回は複数文字渡せるようにしました。

g.Delimiter = "_"

Rule

Rule とは、Generator の 1 ブロックを生成する機能を実装したものです。Generator は設定された RuleDelimiter で結合して ID を生成します。
このパッケージには標準で使用できる Rule がいくつか実装されているので、一部を紹介します。

ランダムな文字列を使用する

// a-ZA-Z のアルファベットをランダムに使用する。
rule.RandomAlphabet(4)
// A-Z のアルファベットをランダムに使用する。
rule.RandomUppercaseAlphabet(2)
// a-Z のアルファベットをランダムに使用する。
rule.RandomLowercaseAlphabet(2)
// 0-9 の数字をランダムに使用する。
rule.RandomNumeric(2)
// a-ZA-Z0-9 のアルファベットと数字をランダムに使用する。
rule.RandomAlphabetAndNumeric(2)

連番を使用する

// 連番を使用する。
rule.Numbering()
// 0 でパディングされた連番を使用する。
rule.NumberingWithPadding(4)

この連番の Rule は、rule.Counter を使用することでカスタマイズできます。

c := &rule.Counter{
	// 5 から開始する
	Start:   5,
	// 2 ずつインクリメントする
	Size:    2,
	// 6 桁でパディングする
	Padding: 6,
}

リストを使用する

// リストの文字列をランダムに使用する。
rule.RandomList(
	[]string{"Dog", "Cat", "Fox", "Rat"},
)

複数の Rule を組み合わせる

rule.Mixin を使用することで、複数の Rule を結合して使用することができます。
例えば、以下のように設定した場合、

sn.NewGenerator(
	rule.Mixin(
		rule.RandomUppercaseAlphabet(2),
		rule.RandomLowercaseAlphabet(2),
		rule.RandomNumeric(2),
	),
	rule.NumberingWithPadding(4),
)

このような実行結果になります。

FMra02-0000
PPgw98-0001
DPqo51-0002
AGrh11-0003
XLfv53-0004

カスタム Rule を使用する

Rule はシンプルな関数なので、独自の Rule を簡単に作成できます。

sn.NewGenerator(
	func() []rune {
		return []rune("PREFIX")
	},
	rule.NumberingWithPadding(4),
)

その他

このパッケージは本来の ID 生成以外にもダミーデータの生成などで使用できます。
例えば、以下のようなルールを設定すれば、メールアドレスのダミーデータを生成できます。

package main

import (
	"fmt"

	"github.com/kenkyu392/go-sn"
	"github.com/kenkyu392/go-sn/rule"
)

func main() {
	g := sn.NewGenerator(
		rule.Mixin(
			rule.RandomAlphabet(4),
			rule.String("."),
			rule.RandomAlphabetAndNumeric(6),
		),
		rule.RandomList(
			[]string{
				"example.com",
				"example.net",
				"example.org",
			},
		),
	)
	g.Delimiter = "@"
	for i := 0; i < 5; i++ {
		fmt.Println(g.String())
	}
}
Lbtr.99VmO8@example.net
Cnat.GAgx19@example.org
KvdO.p87x51@example.net
UKHv.gtAME8@example.org
YTCp.632C96@example.com

まとめ

シンプルで用途も限られる簡単なパッケージですが、良ければ使ってみてください。
まだ作ったばかりで機能が少ないので、Rule の追加やご指摘などコントリビュートもお待ちしてます。

https://github.com/kenkyu392/go-sn

Discussion

ログインするとコメントできます