1、net.http 第一个版本 package main import ( io log net/http ) func main() { // 设置路由 http.HandleFunc(/, func(writer http.ResponseWriter, request *http.Request) { io.WriteString(writer, hello world! this is http test demo01) }) err := http.ListenAndServe(:8080, nil) if err != 在Go语言中,构建Web应用是一项常见的任务,`net/http`包是官方提供的标准库,用于处理HTTP服务器和客户端的编程。在这个“Go Web基本应用”中,我们可以通过几个简单的示例来理解如何使用`net/http`包创建一个基本的HTTP服务器。 **第一个版本** 在最基础的版本中,我们导入了`io`, `log`和`net/http`这三个包。`main`函数中,我们使用`http.HandleFunc()`设置了一个简单的路由,监听`/`路径。当接收到请求时,它会将字符串"hello world! this is http test demo01"写入响应体。然后,`http.ListenAndServe()`用于启动服务器,监听8080端口。如果在启动过程中出现错误,`log.Fatal()`会被调用来记录并终止程序。 ```go package main import ( "io" "log" "net/http" ) func main() { http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { io.WriteString(writer, "hello world! this is http test demo01") }) err := http.ListenAndServe(":8080", nil) if err != nil { log.Fatal(err) } } ``` **第二个版本** 这个版本引入了HTTP处理器接口的概念。我们定义了一个名为`myHandler`的结构体,并实现了`ServeHTTP`方法。这允许我们将自定义的行为绑定到处理器上。然后,我们创建了一个`http.ServeMux`实例(多路复用器),用于管理不同的路由。在这里,我们只设置了一个路由,但是可以添加更多的路由以处理不同URL的请求。我们同样使用`http.ListenAndServe()`启动服务器。 ```go package main import ( "io" "log" "net/http" ) type myHandler struct{} func (this *myHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { io.WriteString(writer, "hello world! this is http test demo02\n" + request.URL.String()) } func main() { mux := http.NewServeMux() mux.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { io.WriteString(writer, "hello world! this is http test demo02\n" + request.URL.String()) }) err := http.ListenAndServe(":8080", mux) if err != nil { log.Fatal(err) } } ``` **第三个版本** 第三个版本更进一步,我们使用一个映射(map)来存储多个路由及其对应的处理函数。这样,我们可以根据请求的URL动态地调用合适的处理函数。这里定义了两个处理函数`byebye`和`love`,然后将它们分别映射到`"/bye"`和`"/love"`路径。我们还创建了一个`http.Server`实例,设置了读取头部超时时间为5秒,并将自定义的处理器结构体作为处理器。我们使用`server.ListenAndServe()`启动服务器。 ```go package main import ( "io" "log" "net/http" "time" ) type myHandler struct{} func (*myHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { if h, ok := mf[request.URL.String()]; ok { h(writer, request) return } io.WriteString(writer, "URL:" + request.URL.String()) } func byebye(writer http.ResponseWriter, request *http.Request) { io.WriteString(writer, "bye bye! this is http test demo03\n" + request.URL.String()) } func love(writer http.ResponseWriter, request *http.Request) { io.WriteString(writer, "love! this is http test demo03\n" + request.URL.String()) } var mf map[string]func(http.ResponseWriter, *http.Request) func main() { server := http.Server{ Addr: ":8080", Handler: &myHandler{}, ReadHeaderTimeout: 5 * time.Second, } mf = make(map[string]func(http.ResponseWriter, *http.Request)) mf["/bye"] = byebye mf["/love"] = love err := server.ListenAndServe() if err != nil { log.Fatal(err) } } ``` 总结来说,这些示例展示了如何使用Go的`net/http`包构建Web应用的基本步骤,包括设置路由、实现自定义处理器以及使用多路复用器管理路由。随着版本的递进,我们看到了如何增加功能和灵活性,比如通过映射来调用不同的处理函数。这些基本概念是构建复杂Web服务的基础,对于理解和开发Go语言的Web应用程序至关重要。
- 粉丝: 6
- 资源: 929
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助