ホームページ >バックエンド開発 >Golang >Gorilla Mux のハンドラー関数に追加の引数を渡すにはどうすればよいですか?

Gorilla Mux のハンドラー関数に追加の引数を渡すにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-17 15:28:02898ブラウズ

How to Pass Additional Arguments to Handler Functions in Gorilla Mux?

Gorilla Mux でのハンドラー引数の処理

Gorilla Mux では、デフォルトでハンドラーは http.ResponseWriter と *http.Request のみを受け取ります。ただし、データベース接続オブジェクトなど、追加の引数をハンドラーに渡す必要があるシナリオもあります。

アプローチ 1: カスタム タイプのメソッドとしてのハンドラー

これを実現する 1 つの方法は次のとおりです。追加データを保持し、http.HandlerFunc インターフェイスを実装するカスタム タイプを定義します。

type UserHandler struct {
    db *gorm.DB
}

func (h UserHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // here you can use db
}

// usage:
db := createDB()
users := UserHandler{db: db}
router.HandleFunc("/users/{id}", users.ServeHTTP)

アプローチ 2: クロージャ関数

別のオプションは、クロージャ関数を使用して実際のデータをラップすることです。

func showUserHandler(db *gorm.DB) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // here you can use db
    }
}

// usage:
db := createDB()
router.HandleFunc("/users/{id}", showUserHandler(db))

アプローチ 3: グローバル変数

特定のシナリオでは、特にデータベース接続などの共有リソースの場合、グローバル変数の使用が許容される場合があります。ただし、それらを慎重に使用し、潜在的な欠点を理解することが重要です。

var db *gorm.DB = createDB()

func showUserHandler(w http.ResponseWriter, r *http.Request) {
    // here you can use db
}

// usage:
router.HandleFunc("/users/{id}", showUserHandler)

ヒント

  • データベース オブジェクトにグローバル変数を使用することは、一般に推奨されません。同時実行の問題が発生します。
  • 最適なアプローチは、特定の要件によって異なります。
  • 単一のデータベース オブジェクトの場合は、クロージャー関数またはハンドラー メソッドのアプローチがより適切です。
  • 複数のインスタンスまたはより複雑な依存関係がある場合は、ハンドラーを介して渡すことができるカスタム コンテキスト タイプを作成することを検討してください。

以上がGorilla Mux のハンドラー関数に追加の引数を渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。