首頁 >後端開發 >Golang >Golang 攔截器: 一覽無餘

Golang 攔截器: 一覽無餘

WBOY
WBOY原創
2024-04-07 21:24:021003瀏覽

綜述:Go 攔截器是透過中介軟體實現的一種處理函數前後邏輯的機制。原理:攔截器作為參數傳遞給函數,在函數執行前後的邏輯。實戰:透過建立記錄請求時間和校驗請求參數的攔截器,並將其連結到 HTTP 處理程序,展示了攔截器的應用。

Golang 拦截器: 一览无余

Go 攔截器:一覽無餘

簡介

攔截器是一種在函數執行前後做一些處理的機制。在 Golang 中,可以使用中介軟體(middleware)來實作攔截器。

原理

攔截器透過將自己作為參數傳遞給要攔截的函數來運作。當函數被呼叫時,攔截器將在函數執行前後執行其邏輯。

實戰案例

我們建立一個簡單的HTTP 伺服器來示範如何使用攔截器:

package main

import (
    "log"
    "net/http"
)

func main() {
    // 创建一个记录请求时间的拦截器
    timeInterceptor := func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            start := time.Now()
            defer func() { log.Printf("请求处理耗时:%fs", time.Since(start).Seconds()) }()
            next.ServeHTTP(w, r)
        })
    }

    // 创建一个校验请求参数的拦截器
    paramInterceptor := func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            if r.URL.Query().Get("id") == "" {
                http.Error(w, "缺少参数:id", http.StatusBadRequest)
                return
            }
            next.ServeHTTP(w, r)
        })
    }

    // 将拦截器与 HTTP 处理程序链接
    handler := paramInterceptor(timeInterceptor(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, World!"))
    })))

    // 启动服务器
    log.Fatal(http.ListenAndServe(":8080", handler))
}

在這個範例中,timeInterceptor 攔截器記錄請求處理時間,而paramInterceptor 攔截器校驗請求參數。透過將攔截器連結起來,我們可以在處理請求之前和之後執行這些邏輯。

總結

攔截器是增強 Golang 程式功能的強大工具。它們允許你在函數執行前後執行自訂程式碼,從而實現諸如記錄、驗證和授權等操作。

以上是Golang 攔截器: 一覽無餘的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn