ホームページ  >  記事  >  バックエンド開発  >  go-yaml を使用して整数値を 16 進数にマーシャリングするにはどうすればよいですか?

go-yaml を使用して整数値を 16 進数にマーシャリングするにはどうすればよいですか?

PHPz
PHPz転載
2024-02-09 09:33:09479ブラウズ

如何使用 go-yaml 将整数值编组为十六进制?

php エディター Banana では、go-yaml を使用して整数値を 16 進数にマーシャリングする方法を紹介します。 go-yaml は、YAML 形式のデータを処理するための Go 言語ライブラリであり、シンプルで使いやすい API を提供します。整数値を 16 進数にマーシャリングするには、まず整数をバイト スライスに変換し、次に fmt.Sprintf 関数を使用してバイト スライスを 16 進文字列にフォーマットします。最後に、go-yaml ライブラリを使用して、フォーマットされた文字列を YAML ファイルに書き込むことができます。この方法はシンプルかつ効率的であり、私たちのニーズを満たすことができます。次に、具体的な実装手順を詳しく見てみましょう。

質問内容

人間にとって意味のある16進数表現の整数フィールドを持つ構造体があります。たとえば、Vendor ID フィールドに設定します。

手動編集のためにこのデータを YAML ファイルに保存し、そのファイルからロードしたいと考えています。私が理解している限り、YAML 自体の数値の 16 進表現には問題はありませんが、go-yaml (私は v3 を使用しています) は整数を 10 進形式でエンコードしているため、見つかりませんでした。方法 16 進形式で保存する通常の方法。

次のコードを開始点として見てみましょう:

リーリー

このコードは、10 進数値を含む YAML を生成します:

リーリー

次に、go-yaml を使用すると、独自の型のカスタム マーシャラーを作成できます。私はこれを行いました(fmt.Sprintf()フォーマット文字列の0xプレフィックスを意図的に省略しました):

リーリー

このコードは、0x 接頭辞なしで 16 進値を生成します (これは現時点では論理的です):

リーリー

ただし、カスタム マーシャラーに 0x プレフィックスを追加すると、次のようになります。 リーリー

値は正しく生成されますが、数値ではなく文字列です:

リーリー

この行を数値にアンマーシャリングするために、カスタム アンマーシャラーも作成する必要がありました。この解決策は好きではありません。

最後に次の質問があります:

  1. go-yaml を使用して 16 進数を生成する簡単な方法はありますか?

  2. パッケージ自体を変更せずに、パッケージの拡張機能として

    go-yaml に基づくカスタム エンコーダーを作成することは可能ですか?私にとって、より便利な方法は、たとえば次のように、構造の説明でフォーマット タグを渡すことです。 リーリー

  3. これにパッケージ コードの変更が必要な場合、この状況に対する Go のアプローチは何ですか?パッケージ ファイルをプロジェクトにコピーし、必要に応じて変更してローカルにインポートするだけですか?
回避策

ここでの問題は、yaml 内の文字列の引用符はオプションですが、

go-yaml

は JSON エンコーダーの内部アーキテクチャと同じものを使用することです。これは、カスタム マーシャリングが最初に処理され、次に引用ロジックが完全に独立して適用されることを意味します。 deadbeef は引用符で囲まれませんが、0xdeadbeef は後者の が数字 であるため引用符で囲まれます。カスタム マーシャラーは文字列であると認識している場合に文字列を返すため、誤って数値にアンマーシャリングされないように引用符で囲まれています。 deadbeef は有効な数値として読み取ることができないため、引用符は必要ありません。できることは 2 つあります:

文字列からの完全なカスタム マーシャリング/アンマーシャリング:
  1. リーリー
go-yaml
    をフォークして変更します。これを行う場合、ソース ファイル内のインポートは変更されません。代わりに、次のように
  1. replace ディレクティブを go.mod に追加する必要があります。 リーリー 私が解決策 1 を好むのは、他の人が生成した yaml から逸脱することなく、好きな方法で値をシリアル化でき、ブランチを維持する必要がないからです。

以上がgo-yaml を使用して整数値を 16 進数にマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。