ホームページ > バックエンド開発 > Golang > go&#s http.servemuxだけが必要です

go&#s http.servemuxだけが必要です

Mary-Kate Olsen
リリース: 2025-01-27 22:07:10
オリジナル
947 人が閲覧しました

GO 1.22標準ライブラリのhttp.servemuxの最適化とアプリケーション分析

GO Web開発の分野では、より効率的で柔軟なルーティング機能を達成するために、多くの開発者はHTTProuterやGorilla/MUXなどの第3パーティライブラリを導入することを選択します。ただし、GO 1.22バージョンでは、標準ライブラリのHTTP.Servemuxの公式最適化により、第3パーティルートライブラリへの依存の依存度が低下すると予想されます。

1。go1.22ハイライト:拡張モードマッチング能力

GO 1.22バージョンは非常に期待されている提案を実現し、標準のライブラリネット/HTTPパッケージのデフォルトのHTTPサービスマルチロードコンプリシーターモードマッチング機能を強化しました。既存のマルチウェイの再利用(http.servemux)は、比較的限られている基本的なパスマッチング関数のみを提供することができるため、より強力なルート機能のための開発者のニーズを満たすために多数の第3パーティライブラリが得られます。 Go 1.22の新しいマルチウェイリアーは、高度なマッチング機能を導入することにより、第3パーティライブラリとの関数ギャップを大幅に削減します。この記事では、RESTサーバーの例を提供する新しいマルチウェイ再利用(MUX)を簡単に紹介し、新しい標準ライブラリMUXとGorilla/MUXのパフォーマンスを比較します。

2。新しいmux

の使用方法 3番目のパーティMUX/ルーター(Gorilla/Muxなど)を持つGO開発者の場合、新しい標準MUXを使用することはシンプルで馴染みのあるものです。開発者は最初に公式文書を読むことをお勧めしますが、これは簡単で明確です。

(1)基本的な使用例

次のコードは、muxのいくつかの新しいモードマッチング関数を示しています:

経験豊富なGOプログラマーはすぐに2つの新機能に気付くことができます:
<code class="language-go">package main
import (
  "fmt"
  "net/http"
)
func main() {
  mux := http.NewServeMux()
  mux.HandleFunc("GET /path/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "got path\n")
  })
  mux.HandleFunc("/task/{id}/", func(w http.ResponseWriter, r *http.Request) {
    id := r.PathValue("id")
    fmt.Fprintf(w, "handling task with %s\n", id)
  })
  http.ListenAndServe(":8090", mux)
}</code>
ログイン後にコピー
ログイン後にコピー

最初の処理プログラムでは、HTTPメソッド(この例では取得)がパターンの一部として明示的に使用されます。これは、ここでの処理プログラムは、
    のパスのGETリクエストにのみ応答し、他のHTTPメソッドのリクエストは処理されないことを意味します。
  1. 2番目の処理プログラムでは、2番目のパスコンポーネント/path/には、以前のバージョンではサポートされていない形式が含まれています。このパスは、単一のパスコンポーネントと一致する可能性があり、処理プログラムは要求された
  2. メソッドを介して一致する値を取得できます。
  3. {id} PathValue以下は、Curlコマンドを使用してこのサーバーをテストする例です。
テスト結果から、サーバーは

投稿のリクエストを拒否し、GETリクエストのみを許可していることがわかります(curlデフォルトではget requestsを使用します)。同時に、リクエストが一致する場合、

ピッチに対応する値が与えられます。開発者は、新しいServemuxドキュメントを詳細に参照して、Tail PathやMix Matchingルール、
<code class="language-bash">$ gotip run sample.go
# 在另一个终端测试
$ curl localhost:8090/what/
404 page not found
$ curl localhost:8090/path/
got path
$ curl -X POST localhost:8090/path/
Method Not Allowed
$ curl localhost:8090/task/leapcell/
handling task with leapcell</code>
ログイン後にコピー
ログイン後にコピー
のパスの厳格な一致などの機能を学習することをお勧めします。

/path/(2)モード競合治療id {id}この提案は、異なるモデル間の対立に特別な注意を払っています。以下は例です:{$}

サーバーが

の要求を受信すると、両方の処理手順がこのリクエストと一致する可能性があります。新しいServemuxドキュメントでは、パターン優先ルールと潜在的な競合への対処方法について説明します。競合が発生した場合、登録プロセスはパニックを引き起こします。上記の例では、次のエラーメッセージが表示されます。
<code class="language-go">package main
import (
  "fmt"
  "net/http"
)
func main() {
  mux := http.NewServeMux()
  mux.HandleFunc("GET /path/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "got path\n")
  })
  mux.HandleFunc("/task/{id}/", func(w http.ResponseWriter, r *http.Request) {
    id := r.PathValue("id")
    fmt.Fprintf(w, "handling task with %s\n", id)
  })
  http.ListenAndServe(":8090", mux)
}</code>
ログイン後にコピー
ログイン後にコピー

このエラーメッセージは詳細かつ実用的です。複雑な登録シナリオ(特にソースコードの複数のポジションで登録する場合)では、これらの詳細は、開発者が競合の問題を迅速に見つけて解決するのに役立ちます。

3。新しいmuxを使用してサーバーを実装

GOのRESTサーバーシリーズでは、さまざまな方法を使用して、タスクに単純なサーバーを実装します/GOで適用されます。最初の部分は標準ライブラリに基づいており、2番目の部分はGorilla/Muxルーターを使用して同じサーバーを再実装します。現在、GO 1.22 Enhanced MUXを使用してこのサーバーを再度実装することは非常に重要であり、Gorilla/MUXを使用したソリューションと比較することも興味深いことです。

(1)モード登録の例

以下は、代表モード登録コードの一部です:

<code class="language-bash">$ gotip run sample.go
# 在另一个终端测试
$ curl localhost:8090/what/
404 page not found
$ curl localhost:8090/path/
got path
$ curl -X POST localhost:8090/path/
Method Not Allowed
$ curl localhost:8090/task/leapcell/
handling task with leapcell</code>
ログイン後にコピー
ログイン後にコピー
Gorilla/Muxの例と同様に、特定のHTTPメソッドを使用して同じパスを使用して、異なる処理手順へのリクエストルーティングを次に示します。古いhttp.servemuxを使用する場合、この種のマッチングデバイスは同じ処理プログラムにリクエストを指示し、処理プログラムはリクエスト方法に従ってフォローアップ操作を決定します。

(2)プログラムの処理プロセス

以下は、処理プログラムの例です。

ここで、プロセスは
<code class="language-go">mux := http.NewServeMux()
mux.HandleFunc("/task/{id}/status/", func(w http.ResponseWriter, r *http.Request) {
        id := r.PathValue("id")
        fmt.Fprintf(w, "handling task status with %s\n", id)
})
mux.HandleFunc("/task/0/{action}/", func(w http.ResponseWriter, r *http.Request) {
        action := r.PathValue("action")
        fmt.Fprintf(w, "handling task action with %s\n", action)
})</code>
ログイン後にコピー
から抽出され、ID値を抽出します。これはGorillaメソッドに似ています。ただし、の誤差に注意を払う必要があります。 req.PathValue("id") {id}一般に、最終結果はGorilla/Muxを使用したソリューションに非常に似ています。従来の標準ライブラリ法と比較して、新しいMUXはより複雑なルーティング操作を実行し、ルーティング決定を処理プログラム自体に任せるニーズを減らし、開発効率とコードメンテナンスを改善することができます。 strconv.Atoi 4、結論

「どのルートを選択する必要がありますか?」 1.22がリリースされた後、この質問に対する答えが変わる可能性があります。多くの開発者は、新しい標準ライブラリMUXがニーズを満たすのに十分であるため、3番目のパーティパッケージに依存する必要があることに気付くでしょう。

もちろん、一部の開発者は、おなじみの第3パーティライブラリを選択し続けますが、これも合理的です。 Gorilla/Muxのようなルーターには、標準ライブラリよりも多くの機能があります。さらに、多くのGOプログラマーは、ルーターを提供するだけでなく、Webバックエンドを構築するために必要な入札ツールを提供するため、GINなどの軽量フレームワークを選択します。

要するに、GO 1.22標準ライブラリHTTP.SERVの最適化は、間違いなく前向きな変化です。開発者が3番目のパーティパッケージを使用するか、標準ライブラリの使用を主張するかに関係なく、標準ライブラリを強化する機能は、GO開発コミュニティ全体に有益です。

Leapcell:GOアプリケーションのホスティング、非同期タスク、およびサーバーのないプラットフォームのRedis

最後に、GOサービスの展開に最も適したプラットフォームをお勧めします:Leapcell

  1. マルチ言語サポート
    JavaScript、Python、GoまたはRustを使用して開発します。
    無料の展開無制限プロジェクト
    使用のために支払うだけです - リクエストなし、費用はかかりません。
比類のないコストのメリット
オンデマンドで支払い、アイドルコストはありません。
  • 例:25ドルは694万件のリクエストをサポートし、平均応答時間は60ミリ秒です。
単純化された開発者エクスペリエンス
直感的なUI、簡単な設定。
  • 完全に自動化されたCI/CDパイプラインとGitOpsの統合。
  • REAL -TIMEインジケーターとログレコードは、操作洞察を提供します。
簡単な拡張と高性能
高度と合併を簡単に処理する自動拡張機能。
  • ゼロ運用費用 - 建設に焦点を合わせます。
  • Leapcell Twitter:
https://www.php.cn/link/7884effb9452a6d7a794999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

(注:画像リンクにアクセスできないため、画像ラベルを保持しているので、画像のパスが正しいことを確認してください。)

以上がgo&#s http.servemuxだけが必要ですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート