見出し画像

【Golang】MergoでYAMLのbool型のマージで嵌った

こんにちは!!都内でITエンジニアをしている ゆる写 です。
今日はJavaのバッチプログラムをGolangに移植する際に嵌った事を紹介します。


概要

弊社では本番環境、開発環境、ローカル開発環境のパラメータをYAMLで管理し環境ごとに切り替えています。環境ごとにパラメータを切り替えるためYAMLのマージングライブラリであるMergoを使用しています。

今回ご紹介するのはissueにも上がっているbool値のマージです。
まずはissueを御覧ください。

As you can see overriding true with false fails, however overriding false with true works

#249 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にリプライで

Stuck with the same issue. Fixed with mergo.WithoutDereference and pointer to bool in structure

#249 bool 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

期待する動作をしてくれました。
同じように悩んでいる方はぜひお試しあれ

ではまた

この記事が気に入ったらサポートをしてみませんか?