[JP] go-sn - Go で適当なシリアルナンバーを生成で きるケージを作った

12604 단어 opensourceshowdevgo
この記事は2021年11月に zenn.dev で公開されたものです.

なぜ作たのか



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

https://github.com/kenkyu392/go-sn
  • 連番を設定してくれる
  • 単語などのlist를 사용하는 것
  • 人間が読める(human-readable) ID も生成できる

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

    使い方



    使い方は rule.Rule を設定した sn.Generator を作成して String メソddを呼び出すだけです.

    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 とは、 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 はshinplな関数なので、独自の Rule を簡単に作成できます.

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


    その他



    このパッケージは本来の ID 生成以外にもダミーデータの生成などで用できます.
    例えば, 以下のようなルールを設定すれば, meerruadressnodamiーde-taを生成できます.

    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())
        }
    }
    



    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    


    まとめ



    shinplude用途も限られる簡単な팍케이지ですが、良ければ使ってみてください.
    まだ作ったばかりで機能が少ないので、 Rule の追加やご指摘など콘트리뷰트도 お待ちしてます.

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

    좋은 웹페이지 즐겨찾기