【Golang】MergoでYAMLのbool型のマージで嵌った
こんにちは!!都内でITエンジニアをしている ゆる写 です。
今日はJavaのバッチプログラムをGolangに移植する際に嵌った事を紹介します。
概要
弊社では本番環境、開発環境、ローカル開発環境のパラメータをYAMLで管理し環境ごとに切り替えています。環境ごとにパラメータを切り替えるためYAMLのマージングライブラリであるMergoを使用しています。
今回ご紹介するのはissueにも上がっているbool値のマージです。
まずはissueを御覧ください。
訳すと
ご覧のように、trueをfalseで上書きすると失敗しますが、falseをtrueで上書きするとうまくいきます。
デフォルト値がtrueの場合、falseで上書きできない。trueのまま
デフォルト値がfalseの場合、trueで上書きすることができる。
デフォル値がtrueの場合の挙動がおかしいよってことですね。
issueに掲載されているコードを確認してみます。
destの値をsrcの値で上書きするコードのようですね。
不具合の再現
デフォルト値がtrueの場合
実行結果
dest.C = trueがtrueのままなので上書きに失敗する。
{a 52 false 2012-02-02}
{a 52 true 2012-02-02}
{A:a B:52 C:true D:2012-02-02}
本来は
{a 52 false 2012-02-02}
{a 52 true 2012-02-02}
{A:a B:52 C:false D:2012-02-02}
デフォルト値がfalseの場合
実行結果
dest.C = falseがtrueに上書きされているため正しい動作になる。
{a 52 true 2012-02-02}
{a 52 true 2012-02-02}
{A:a B:52 C:true D:2012-02-02}
解決方法
issueにリプライで
訳すと
同じ問題で立ち往生。mergo.WithoutDereferenceと構造体内のboolへのポインタを修正しました。
これだけだと何を言っているのかよく分かりませんね。
mergo.WithoutDereferenceとはmergo.Merge()の第3引数のことかな?
structのbool型をポインタに修正するのかな?
と予想をたててGo Playgroundで試してみます。
デフォルト値がtrueの場合
実行結果
dest.C = trueがfalseに上書きされる。
a 52 true 2012-02-02
b 12 false 2012-02-03
A:b B:12 C:false D:2012-02-03
デフォルト値がfalseの場合
実行結果
dest.C = falseがtrueに上書きされる。
a 52 false 2012-02-02
b 12 true 2012-02-03
A:b B:12 C:true D:2012-02-03
期待する動作をしてくれました。
同じように悩んでいる方はぜひお試しあれ
ではまた