私たちのJSONパースライブラリーのための公式の標準をgolang - encoding/json
と、ほとんどの場合、それは十分に良いされています。パフォーマンス-しかし、この分析パッケージには大きな問題があります。それは十分に速くはありませんが、我々は、高性能を開発する場合、並行性の高いネットワークサービスを満たすことができない、あなたは現在、比較的高い性能を有する、高性能なJSONの構文解析ライブラリを必要json-iterator
とeasyjson
。
今、私たちはここのために、ライブラリを解析する高性能JSONを導入する必要があるjson-iterator
例が、私たちはすべての残りの保証に代わるものではありません、小さな領域をテストすることが可能である、と私たちは2つのライブラリを解決する必要があり、この時間が存在するので、この時、私たち我々はそれを必要とするコンパイルして実行するためにリゾルバライブラリを選択するにはどのように?
上記の問題を解決するには、条件付きコンパイルです。この問題を解決するための基礎を提供してくれる言語を行く制約タグをコンパイルすることです。
統一されたJSONライブラリー
のは、結果を確認するために例を挙げてみましょう。今、私たちは2つのライブラリが存在する必要があるので、我々は、我々は独自の使用これらの2つのライブラリ(アダプタモードを参照してください)、の統一された用法来るjson
合うようにパッケージをencoding/json
してをjson-iterator
。
JSON / json.go
// +!jsoniter構築 パッケージのJSON (輸入 "エンコーディング/ JSONを" "FMT" ) FUNC MarshalIndent(Vインタフェース{}、接頭辞、インデント文字列)([]バイト、エラー){ fmt.Println(「[使用エンコーディング/ JSON 】パッケージ」) json.MarshalIndent(V、接頭辞、インデント)を返します }
JSON / jsoniter.go
// + jsoniter構築 パッケージのJSON インポート( "FMT" "github.com/json-iterator/go" ) VAR( JSON = jsoniter.ConfigCompatibleWithStandardLibrary ) MarshalIndent FUNC(Vインタフェース{}、接頭辞、インデント文字列)([]バイトをエラー){ fmt.Println( "使用[jsoniter]パッケージ") を返すjson.MarshalIndent(V、接頭辞、インデント) }
次のようにディレクトリ構造は次のとおりです。
json
├── json.go
└── jsoniter.go
する例MarshalIndent
一例として機能し、我々が見つかりました。json
パッケージの下に2つの外出はしているMarshalIndent
機能、および同じシグネチャを定義し、しかし、彼らはまた、ライブラリの実装を解析異なるJSONを使用していて、これは私たちの団結のパッケージを適応した結果であります統一されたコール。
デモデモ
ライブラリの特定の実装をJSON呼び出しを区別するために、印刷ログを区別するために。今、私たちは、使用json.MarshalIndent
テストを。
パッケージメイン インポート( "FMT" "JSON" ) FUNCメイン(){ U =ユーザー{ "マイク"、30} B、ERR = json.MarshalIndent(U、 ""、 "「) 誤る=ゼロ{なら! fmt.Println(ERR) }他{ fmt.Println(文字列(B)) } } と入力ユーザ構造体{ 名前ストリング 年齢INT }
非常に単純に、使用するuser
JSON文字列にオブジェクトの構造と、それをプリントアウト。私たちは、実行go run main.go
結果を参照してください。
[符号化/ JSON]パッケージの使用 { "マイク"、 "名前" "年齢":30 }
我々は維持するために、デフォルトでencoding/json
同じライブラリの道を。今、私たちは別の方法でコンパイルして実行します。
- タグ= jsoniter main.goを実行して行きます
この実行し、最後の違いは、私たちが追加されたことで-tags=jsoniter
、その後、使用json-iterator
新しいJSONライブラリのテストのごく一部を達成するために、条件付きコンパイルの選択であるJSONライブラリを、私たちは目指しています。
条件付きコンパイル
私たちは、キーが条件付きコンパイルであることが判明し-tags=jsoniter
ている、-tags
私たちが行く言語コンパイラの方法を提供するための条件である兆候の一つ。
さて、私たちが最初に始めたときに振り返ってjson/json.go
、json/jsoniter.go
上の2つの移動ファイルを、コメント行があります:
// +build !jsoniter
// +build jsoniter
この2行は、ゴー言語コンパイラのための重要な条件です。+build
これは、タグに続く条件付きコンパイル文のキーワードタグ、条件、として理解することができます。
// +build !jsoniter
表していないタグjsoniter
ゴーファイルをコンパイルするための時間を。 // +build jsoniter
彼はある、タグを表しjsoniter
ゴーファイルをコンパイルするための時間。
換言すれば、これら2つの条件が相互に排他的である、とする場合にのみtags=jsoniter
時間が使用されjson-iterator
、そうでなければ使用しますencoding/json
。
概要
条件付きコンパイルを使用して、我々はライブラリを解析JSONを選択する柔軟性を実現することを目指して、タグが一部でしかありません、言語はまた、ゴーファイルのサフィックスに基づいて、条件付きコンパイルを可能に移動します。