返回文章列表
服务器

如何用 Go 编写一个简单的 HTTP 服务器?

小小
2025-12-11
16小时前
如何用 Go 编写一个简单的 HTTP 服务器?

最近在学习 Go 语言。如果你喜欢在例子中学,推荐两个很棒的入门学习资料,一个是 Go by Example,一个是 Go Web Examples。

Go by Example 从零开始讲解 Go 语言基本语法。

Go Web Examples 在前者基础之上,从零开始讲解服务端开发的初级知识。

软件开发不能只看教程,必须要动手敲一敲,实践出真知。在 Hello World 级别的代码中,也会有一些小坑等着我这样的初学者。

Go 语言内置的 net/http 包,专门处理 HTTP 协议,它自带 HTTP 客户端和一个默认的 HTTP 服务器。

HTTP 请求处理函数的签名如下所示:


func (w http.ResponseWriter, r *http.Request)
w 用于输出响应信息,比如 HTML 什么的。r 包含客户端发出的请求数据,比如请求地址,请求头字段等。
向默认的 HTTP 服务器注册请求处理函数,使用 http.HandleFunc() 方法。
http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {    fmt.Fprintf(w, "Hello, 你访问的地址是 %s\n", r.URL.Path)})
最后,要让服务器监听某个端口,使用 http.ListenAndServe() 方法。

http.ListenAndServe(":80", nil)

完整代码如下所示:

使用 go build 命令编译程序,会生成一个和源文件同名的可执行文件。


我以为执行 ./hello-web 会开启服务器,然后在浏览器访问 localhost/ 会出现我想要的响应文字,但是意外发生了,服务器没有运行,直接退出,而且没有任何报错信息。


在服务端开发,错误不可避免,要想知道为什么报错,可以使用 log.Fatal() 方法,它会打印错误,然后退出应用。

加上错误处理代码后,整体程序如下所示:

再编译,再运行,这次知道了,服务器没有运行,是因为权限不够。


为什么权限不够?因为在我使用的 Ubuntu Linux 系统中,1-1023 号端口是特权端口,只有 root 用户才能绑定这些端口。1024 以上的非特权端口才能随便使用。

定位到错误原因,处理方法也就明确了。我有两条路可走:要么把 80 端口改成非特权端口,比如 8080。要么把自己提升为 root 级别的特权,再运行服务器程序。

第二种方法,其实就是用 sudo 前缀运行程序。

sudo ./hello-web
此时,用浏览器访问 localhost/,就能看到期望的结果。

本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。

分享文章
合作伙伴

本站所有广告均是第三方投放,详情请查询本站用户协议