发布时间:2024-12-22 23:03:34
下面是一个基本的示例:
``` go package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, World!") } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } ``` 这段代码实现了一个最简单的HTTP服务。当有请求到达时,会调用`handler`函数,并将一个`http.ResponseWriter`对象和一个`http.Request`对象传递给该函数。我们可以通过`http.ResponseWriter`对象来写入响应内容,而`http.Request`对象则包含了关于请求的各种信息,例如请求方法、URL路径以及头部信息等。下面是一个示例,演示如何提供静态文件:
``` go package main import ( "net/http" ) func main() { fs := http.FileServer(http.Dir("static")) http.Handle("/static/", http.StripPrefix("/static/", fs)) http.ListenAndServe(":8080", nil) } ``` 这段代码将`static`目录下存放的静态文件暴露在了`/static/`路径下。我们通过调用`http.FileServer`函数创建了一个文件服务器,并将其与路径`/static/`进行了绑定。然后,通过调用`http.StripPrefix`函数,移除了路径前缀,以便访问静态文件时不需要包含`/static/`。下面是一个将Go结构体转换为JSON并返回给客户端的示例:
``` go package main import ( "encoding/json" "net/http" ) type User struct { Name string `json:"name"` Email string `json:"email"` } func handler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") user := User{ Name: "John", Email: "john@example.com", } json.NewEncoder(w).Encode(user) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } ``` 在上面的代码中,我们首先设置了响应头部的`Content-Type`字段为`application/json`,以便告知客户端返回JSON数据。然后,创建了一个`User`结构体并填充了一些数据。最后,通过调用`json.NewEncoder`函数来编码`User`结构体,并将结果写入`http.ResponseWriter`对象以返回给客户端。下面是一个示例,演示如何获取URL查询参数:
``` go package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { values := r.URL.Query() name := values.Get("name") fmt.Fprintf(w, "Hello, %s!", name) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } ``` 在上述代码中,我们通过调用`r.URL.Query`函数获取到了URL的查询参数,然后通过调用`Get`方法来获取名为`name`的参数的值。最后,将结果写入`http.ResponseWriter`对象以返回给客户端。下面是一个示例,演示如何实现一个简单的日志中间件:
``` go package main import ( "log" "net/http" "time" ) func Logger(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() next.ServeHTTP(w, r) log.Printf("[%s] %s %s", r.Method, r.RequestURI, time.Since(start)) }) } func handler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, World!")) } func main() { http.Handle("/", Logger(http.HandlerFunc(handler))) http.ListenAndServe(":8080", nil) } ``` 在上述代码中,我们定义了一个`Logger`函数,它接受一个`http.Handler`对象作为参数,并返回一个新的`http.Handler`对象。在新的`http.Handler`对象中,我们首先记录了请求的开始时间。然后,调用原始的`http.Handler`对象的`ServeHTTP`方法来处理请求。最后,我们在处理完请求后,再次记录了请求的结束时间,并打印出相关的信息。