go go go 出发咯 - go web开发入门系列(一) helloworld
Go 语言(又称 Golang)凭借其简洁的语法、出色的性能和强大的并发处理能力,在 Web 开发领域变得越来越受欢迎。与其他语言不同,Go 拥有一个非常强大的标准库 net/http
,让你无需依赖任何第三方框架,就能轻松构建起一个功能完整的 Web 服务器。
这篇博文将带你从零开始,一步步学习如何使用 net/http
包来创建你的第一个 Go Web 应用。
开始之前,先叠个甲,默认你现在已经学完了go的基础部分,现在来学习go web相关的内容,使用go语言进行后端开发
准备工作
在开始之前,请确保你已经:
- 安装了 Go。
- 配置好了你的 Go 开发环境(例如设置了
GOPATH
或使用 Go Modules)。 - 了解 Go 语言的基础语法。
ps:我使用的go sdk 是 go1.24.4 windows/386
1. 你的第一个 "Hello, World" 服务器
让我们从一个最简单的 Web 服务器开始。搭建最简单的go应用服务

代码示例
创建一个名为 main.go
的文件,并输入以下代码:
go
package main
import (
"fmt"
"log"
"net/http"
)
// 定义一个处理器函数 (handler function)
// w: 用于向客户端发送响应
// r: 代表来自客户端的 HTTP 请求
func helloHandler(w http.ResponseWriter, r *http.Request) {
// 向响应写入内容
fmt.Fprintf(w, "Hello, World! 你访问的路径是: %s", r.URL.Path)
}
func main() {
// 注册处理器函数,当访问根路径 "/" 时,调用 helloHandler
http.HandleFunc("/", helloHandler)
// 启动服务器,监听 8080 端口
log.Println("服务器启动中,监听端口 8080...")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("服务器启动失败: ", err)
}
}
简单为上述代码做个解释:
代码解析:
package main
: 声明这是一个可执行程序。import (...)
: 导入我们需要的包。net/http
是核心,fmt
用于格式化字符串,log
用于输出日志。helloHandler(w http.ResponseWriter, r \*http.Request)
: 这是一个处理器函数 。所有处理 Web 请求的函数都必须符合这个签名。
http.ResponseWriter
: 一个接口,你的服务器通过它来向客户端写入响应头和响应体。*http.Request
: 一个结构体,包含了客户端发来的所有请求信息,比如请求方法 (GET, POST)、URL、请求头等。http.HandleFunc("/", helloHandler)
: 这行代码的作用是注册路由 。它告诉net/http
包,当有请求访问网站的根路径 (/
) 时,应该调用helloHandler
函数来处理。http.ListenAndServe(":8080", nil)
: 这是启动服务器的关键。
- 第一个参数
":8080"
表示服务器在本地的 8080 端口上进行监听。- 第二个参数
nil
表示我们使用默认的ServeMux
(可以理解为一个路由分发器)。我们通过http.HandleFunc
注册的处理器就是被注册到了这个默认的ServeMux
上。
代码运行
在goland
中直接启动或者cd命令行进入该项目,执行
bash
go run main.go
PS D:\workspace\Go\helloworld> go run .\main.go
2025/07/08 10:53:12 服务器启动中,监听端口 8080...
然后打开浏览器,访问localhost:8080

2. 理解处理器 (Handler)
在 Go 中,任何实现了 http.Handler
接口的类型都可以作为一个请求处理器。这个接口非常简单,只有一个方法:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
我们之前写的 helloHandler
函数之所以能工作,是因为 http.HandleFunc
在内部做了一个适配,将一个具有正确签名的函数(如 helloHandler
)转换成了一个 http.Handler
。
理解 http.ResponseWriter
和 *http.Request
是 Web 开发的关键。
*http.Request
: 你的信息来源。r.URL.Path
: 获取请求的路径 (例如/
,/about
)。r.Method
: 获取请求方法 (例如 "GET", "POST")。r.Header
: 获取请求头。r.ParseForm()
和r.FormValue("key")
: 解析并获取表单数据。
http.ResponseWriter
: 你的输出工具。w.Write([]byte("..."))
: 写入响应体,这是最常用的方法。w.WriteHeader(http.StatusOK)
: 设置 HTTP 状态码 (例如200 OK
,404 Not Found
)。w.Header().Set("Content-Type", "application/json")
: 设置响应头。
3.提供静态文件服务
一个真实的网站不仅有动态内容,还需要 HTML、CSS、JavaScript 和图片等静态文件。net/http
包也提供了非常便捷的方式来处理它们。
假设你的项目结构如下:
text
/
|-- main.go
|-- static/
|-- index.html
|-- style.css

index.html
html
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Go 静态网站</title>
<link rel="stylesheet" href="/static/style.css">
</head>
<body>
<h1>欢迎来到我的静态网站!</h1>
<p>这个文件由 Go 服务器提供。</p>
</body>
</html>
style.css
css
body {
font-family: sans-serif;
background-color: #f0f0f0;
color: #333;
}
修改main.go文件如下:
go
package main
import (
"log"
"net/http"
)
func main() {
// 创建一个文件服务器,指向 "static" 目录
fs := http.FileServer(http.Dir("./static"))
// 将 /static/ 路径的请求交给文件服务器处理
// StripPrefix 会移除 URL 中的 /static/ 前缀,这样文件服务器才能在 static/ 目录中找到文件
http.Handle("/static/", http.StripPrefix("/static/", fs))
// 根路径的处理器,可以用来提供主页
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "./static/index.html")
})
log.Println("服务器启动中,监听端口 8080...")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("服务器启动失败: ", err)
}
}
代码简单解释:
http.FileServer(http.Dir("./static"))
: 创建了一个能够提供static
目录下文件服务的处理器。
http.Handle("/static/", ...)
: 使用http.Handle
注册一个http.Handler
。所有以/static/
开头的请求都会被这个文件服务器处理。
http.StripPrefix(...)
: 这是一个适配器,它会修改请求的 URL。例如,当浏览器请求/static/style.css
时,StripPrefix
会把/static/
去掉,然后把剩下的/style.css
交给文件服务器。文件服务器就会去static
目录下寻找style.css
文件。
http.ServeFile(...)
: 这是一个便捷函数,用于直接响应一个文件。我们用它来将index.html
作为根路径的默认页面。
再次运行,访问localhost:8080
,可以看到静态页面被渲染到了访问网页上。

那么至此,简易的使用 net/http
的后端内容已经搭建完成。