Golang 搭建 Web 服务:从基础路由到自定义 Handler

沿途有光
沿途有光
发布时间:2026-10-16| 7人浏览过
原创

利用 Go 语言标准库 net/http 搭建 Web 服务简单高效。本文将通过三个代码示例,分别展示最简路由模式、ServeMux管理器模式以及自定义 http.Handler 接口模式,帮助开发者理解 Go Web 服务的工作原理并掌握实际操作步骤。

基础 Web 服务搭建

在 Go 中创建 Web 服务主要依赖 net/http 包。最简单的形式是通过 http.HandleFunc 注册路由,并使用 http.ListenAndServe 启动服务。以下代码展示了如何创建一个监听 8000 端口的基础服务:

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/test", doRequest)      // 设置访问路由
    err := http.ListenAndServe(":8000", nil) // 设置监听的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func doRequest(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()       // 解析url传递的参数,对于POST则解析响应包的主体(request body)
    // fmt.Println(r.Form) // 这些信息是输出到服务器端的打印信息
    // fmt.Println("path", r.URL.Path)
    // fmt.Println("scheme", r.URL.Scheme)
    // for k, v := range r.Form {
    //     fmt.Println("key:", k)
    //     fmt.Println("value:", strings.Join(v, ""))
    // }
    fmt.Fprintf(w, "service start...") // 这个写入到w的是输出到客户端的 也可以用下面的 io.WriteString对象

    // 注意:如果没有调用ParseForm方法,下面无法获取表单的数据
    // query := r.URL.Query()
    var uid string // 初始化定义变量
    if r.Method == "GET" {
        uid = r.FormValue("uid")
    } else if r.Method == "POST" {
        uid = r.PostFormValue("uid")
    }
    io.WriteString(w, "uid = "+uid)
}

运行上述代码后,在浏览器或客户端访问 http://127.0.0.1:8000/test?uid=10086 即可看到服务返回的结果。如图所示:

工作原理简析

在上述代码中,核心逻辑如下:

  • 路由注册:http.HandleFunc("/test", doRequest) 将 URL 路径 /test 绑定到处理函数 doRequest。该函数必须符合 func(http.ResponseWriter, *http.Request) 签名。
  • 服务启动:http.ListenAndServe(":8000", nil) 开始监听本地 8000 端口。第二个参数传入 nil 表示使用默认的默认多路复用器(DefaultServeMux)。
  • 请求处理:http.ResponseWriter 用于向客户端写入响应数据,http.Request 封装了请求信息(如 Method、URL、Body 等)。

进阶:使用 ServeMux 管理路由

虽然直接使用全局默认路由器很方便,但在实际项目中,通常建议显式创建 ServeMux 实例以便管理。修改 main 函数部分代码如下:

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/test", doRequest)
    err := http.ListenAndServe(":8000", mux) // 设置监听的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

这种写法与之前效果一致,但更灵活。它明确了路由管理器对象,方便后续添加更多子路由器或中间件逻辑。

高阶:自定义 HTTP Handler

如果需要更精细地控制请求分发逻辑,可以实现 http.Handler 接口。该接口要求实现 ServeHTTP(w http.ResponseWriter, r *http.Request) 方法。以下示例使用一个结构体作为 Handler,并通过 map 动态分发请求:

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
)

var mux map[string]func(http.ResponseWriter, *http.Request)

func main() {
    server := http.Server{
        Addr:    ":8000",
        Handler: &doHandler{},
    }

    mux = make(map[string]func(http.ResponseWriter, *http.Request))
    mux["/test"] = doRequest

    err := server.ListenAndServe()
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

type doHandler struct{}

func (*doHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if res, ok := mux[r.URL.String()]; ok {
        res(w, r)
        return
    }

    io.WriteString(w, "url params: "+r.URL.String())
}

func doRequest(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()                      // 解析url传递的参数,对于POST则解析响应包的主体(request body)
    fmt.Fprintf(w, "service start...") // 这个写入到w的是输出到客户端的 也可以用下面的 io.WriteString对象
}

在此模式中,doHandler 截获所有请求,检查 URL 是否在预定义的 mux 映射中存在。若存在则调用对应的业务函数;若不存在,则返回当前 URL 参数信息。这种方式适合需要统一拦截日志、权限校验或复杂分发的场景。运行结果如下:

总结

以上介绍了使用 Golang 标准库搭建 Web 服务的三种常见方式:基础直接监听、显式使用 ServeMux 以及实现自定义 Handler 接口。这些方法均基于 net/http 包,无需引入第三方框架即可快速启动服务。根据项目复杂度选择合适的模式,即可构建稳定高效的 Go Web 应用。 以上就是使用 Golang 搭建 Web 服务的详细内容,更多关于 Golang Web开发、Go网络编程的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。