golang http

本文详细介绍了Go语言中http.ServeMux的作用、如何使用http.HandleFunc注册处理器函数、以及如何通过http.ListenAndServe启动HTTP服务器。展示了如何创建一个基础的HTTP服务器实例和处理请求的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数说明
http.ServeMux是 Go 语言标准库中的一个多路复用器(multiplexer)。它用于路由和处理 HTTP 请求,将请求分发到相应的处理器函数。
http.HandleFunc是 Go 语言标准库中的一个函数,用于注册处理器函数来处理 HTTP 请求。它是对 http.ServeMux 的简化封装,方便快速实现路由功能。
http.Handler接口定义了一个方法 ServeHTTP,该方法接收两个参数:ResponseWriter 和 Request。它用于处理传入的 HTTP 请求并生成相应的 HTTP 响应。
http.ListenAndServe是 Go 语言标准库中的一个函数,用于启动一个 HTTP 服务器并开始监听指定的地址和端口,以接收和处理传入的 HTTP 请求。

一、使用 http.ServeMux 的一些基本操作:
1、创建一个新的 ServeMux:

mux := http.NewServeMux()

2、注册处理器函数并指定 URL 路径:

mux.HandleFunc("/hello", helloHandler)
mux.HandleFunc("/foo", fooHandler)
//在上面的例子中,当 /hello 路径接收到请求时,helloHandler 函数将被调用;当 /foo 路径接收到请求时,fooHandler 函数将被调用。

3、创建一个 HTTP 服务器并指定 ServeMux 作为处理器:

server := &http.Server{
    Addr:    ":8080",
    Handler: mux,
}
//创建了一个监听 8080 端口的 HTTP 服务器,并将 mux 作为处理器。

4、启动服务器:

err := server.ListenAndServe()
if err != nil {
    panic(err)
}
//这会开始监听指定的端口,并开始接受和处理请求。

完整示例:

package main

import (
	"net/http"
	"time"
)

func main() {
	mux := http.NewServeMux()
	mux.HandleFunc("/", handler)

	server := &http.Server{
		Addr:         ":8080",
		Handler:      http.TimeoutHandler(mux, 2*time.Second, "Timeout"),
		ReadTimeout:  5 * time.Second,
		WriteTimeout: 10 * time.Second,
	}

	err := server.ListenAndServe()
	if err != nil {
		panic(err)
	}
}

func handler(w http.ResponseWriter, r *http.Request) {
	time.Sleep(3 * time.Second) // 模拟长时间处理的操作

	w.Write([]byte("Hello, World!"))
}

package main

import (
	"net/http"
	"time"
)

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8081", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello, World!"))
}

-------------end

### 创建和配置 Golang HTTP 服务器 #### 使用标准库创建基本 HTTP 服务器 为了构建一个简单的 HTTP 服务器,在 Go 中可以利用内置的标准库 `net/http`。通过定义路由并设置处理器函数来响应客户端请求。 ```go package main import ( "fmt" "net/http" ) func helloWorldHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") } func main() { http.HandleFunc("/", helloWorldHandler) err := http.ListenAndServe(":8080", nil) if err != nil { panic(err.Error()) } } ``` 这段代码展示了如何启动监听于端口 8080 的 Web 服务器,并针对根路径 `/` 设置了一个处理程序,当访问该 URL 时会返回字符串 “Hello World”。此过程不涉及任何外部依赖项[^1]。 #### 利用 Mux 库增强路由管理 对于更复杂的项目或者需要支持更多功能的应用来说,可能希望采用第三方路由器包如 Gorilla Mux 来简化开发工作量以及提高灵活性。Mux 提供了模式匹配、子路由等功能特性,使得编写 RESTful API 变得更加容易。 ```go package main import ( "fmt" "github.com/gorilla/mux" "log" "net/http" ) func userHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) userID := vars["id"] fmt.Fprintf(w, "User ID is %v\n", userID) } func main() { r := mux.NewRouter() r.HandleFunc("/users/{id}", userHandler).Methods("GET") log.Fatal(http.ListenAndServe(":8080", r)) } ``` 上述例子中演示了怎样借助 Mux 实现带有参数化路径 (`/users/{id}`) 的 GET 请求处理逻辑;同时指定了允许的方法类型为 GET 方法[^2]。 #### 配置跨域资源共享 (CORS) 在某些情况下,特别是前后端分离架构下,前端应用可能会部署在一个不同的域名上向后端发起 AJAX 调用,则此时就需要考虑解决浏览器同源策略带来的限制问题——即启用 CORS 支持。可以通过自定义中间件的方式实现这一点: ```go func enableCorsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") // 允许所有来源 w.Header().Add("Access-Control-Allow-Headers", "Content-Type") // 添加额外头部字段 next.ServeHTTP(w, r) }) } // 在主函数里注册这个中间件... r.Use(enableCorsMiddleware) ``` 这里展示了一种简单粗暴的做法,实际生产环境中应当谨慎评估安全风险后再决定具体的 Origins 白名单范围等细节[^3]。 #### 处理并发连接和服务生命周期事件 考虑到高负载场景下的性能优化需求,合理设计 Server 端的工作流至关重要。通常做法是在接收到新连接之后立即开启一个新的 goroutine 去执行后续操作,从而确保主线程能够迅速释放资源继续等待下一个到来的新连接。另外还可以加入一些必要的错误恢复机制防止意外崩溃影响整个系统的稳定性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值