お詫び
AdventCalendarの21日目の記事なのですが、筆者がコロナになってしまって書ききれなかったので途中ですが公開だけいたします………。
残りは動けるようになってから仕上げます。
この記事について
こちらの記事はCyberAgent AI tech studio | Go Advent Calendar 2022の21日目の記事です。
筆者について
筆者は業務で書くGo歴は2ヶ月くらいで割とペーペーな部類です。
前職ではPHPを主に書いていたのですが、転職を機にGoを使い始めそのタイミングで社内のAdvent Calendarが開始されたので思い切って参加してみました。
記事内容に対する意見、提案、改善等大歓迎です!
概要
業務中にURLパラメーターを用いて多めの値を受け渡しするという要件に遭遇しました。
単純にhttps://example.com?a=a&b=b&c=c&d=d....
とすべての値を羅列する方法も当初は考えました。
ただ、エンドユーザーには渡されている値がわからないようにするという要件もあったため、URLパラメーターは1つにまとめ、そこに構造体をシリアライズ&暗号化することにしました。
今回はそのシリアライズ部分について記事にしたいと思います。
仕様
- URLパラメーターに受け渡す値のフィールドを持った構造体をシリアライズしたものを入れて、値の受け渡しを行う
- 例)
https://example.com?values=${seriarized_struct}
- 例)
- 受け渡された値はエンドユーザーにわからないようにする
- 暗号化で対応(記事のスコープには含めません)
- シリアライズされた構造体はBase64でエンコードされている
- 各値は渡されないこともあり、渡されなかったこととGoのゼロ値の値で渡されたことを区別する
- 渡されなかった場合はゼロ値で初期化せずに
nil
とする - 値は0で渡された場合に0となるが、渡されなかった場合は0ではなくnilとする
- 渡されなかった場合はゼロ値で初期化せずに
シリアライズ方法の候補
Protobuf
まず一番最初に考えたのはProtobufでした。
Protobufを考えたのは単純に使ったことなかったから使ってみたいとか単純な理由で導入を考えていました。
ただ、Protobufは要件に対して少しオーバースペック気味でした。
やりたいことはただ構造体をシリアライズして文字列でやり取りすることだったので、「渡す側も受け取り側もGoなのにプログラム言語から独立した.protoファイルを書いたりするくらいならGoに組み込まれているgobやjsonのほうが良いのでは?」となりProtobufは見送りました。
encoding/gob
coming soon
encoding/json
coming soon