发布时间:2024-12-23 01:59:40
```go type NotFoundHandler struct{} func (h NotFoundHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) fmt.Fprintf(w, "404 - Page not found") } ```
上述代码创建了一个名为`NotFoundHandler`的结构体,并给其添加了一个名为`ServeHTTP`的方法。在该方法中,我们首先使用`http.StatusNotFound`设置了响应头的状态码为404。然后,我们使用`fmt.Fprintf`向响应写入了一个简单的404错误消息。```go func main() { router := http.NewServeMux() router.Handle("/", NotFoundHandler{}) log.Fatal(http.ListenAndServe(":8080", router)) } ```
上述代码创建了一个HTTP服务器,并将根路径"/"的处理程序设置为我们之前定义的`NotFoundHandler`。最后,我们使用`http.ListenAndServe`函数启动服务器。404.html:
```html
The page you are looking for does not exist. Please check the URL or go back to the homepage.
``` 然后,我们可以在`NotFoundHandler`的`ServeHTTP`方法中使用`template.ParseFiles`函数来解析该HTML文件,并将数据渲染到模板中。```go type NotFoundHandler struct { tpl *template.Template } func (h NotFoundHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) h.tpl.Execute(w, nil) } func main() { tpl, err := template.ParseFiles("404.html") if err != nil { log.Fatal(err) } router := http.NewServeMux() router.Handle("/", NotFoundHandler{tpl}) log.Fatal(http.ListenAndServe(":8080", router)) } ```
在上述代码中,我们将`template.ParseFiles`函数用于解析404.html文件,并将其赋值给`NotFoundHandler`结构体的`tpl`字段。接下来,在`ServeHTTP`方法中,我们使用`Execute`方法将模板渲染到`http.ResponseWriter`中。