- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
12.7 Go 实现 web 服务器
Go 允许您使用它的标准库函数自己实现一个 web 服务器。在这本书中您第一次看到一个用 Go 实现的 web 服务器应用程序是在第10章,Go 并发-进阶讨论,我们讨论 context
包的时候。
尽管用 Go 实现的 web 服务器能做需要高效安全的事情,但如果您真正需要一个强大的 web 服务器,支持模块,多站点和虚拟主机的话,您最好使用如 Apache 或 Nginx 这样的 web 服务器
这个例子程序命名为 www.go
,由五部分展示。它的第一部分包含期望的 import
声明:
package main
import (
"fmt"
"net/http"
"os"
"time"
)
对于 web 服务器不需要操作 time
包。然而,由于服务器要发送时间和日期给客户端,所以这个例子里需要它。
www.go
的第二段代码如下:
func myHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Serving: %s\n", r.URL.Path)
fmt.Printf("Served: %s\n", r.Host)
}
这是该程序的第一个处理函数的实现。一个处理函数取决于使用的配置可以服务一个或多个 URL。
www.go
的第三部分包含如下代码:
func timeHandler(w http.ResponseWriter, r *http.Request) {
t := time.Now().Format(time.RFC1123)
Body := "The current time is:"
fmt.Fprintf(w, "<h1 align=\"center\">%s</h1>", Body)
fmt.Fprintf(w, "<h2 align=\"center\">%s</h2>\n", t)
fmt.Fprintf(w, "Serving: %s\n", r.URL.Path)
fmt.Fprintf(w, "Served time for: %s\n", r.Host)
}
从上面这段 Go 代码,您能看到该程序的第二个处理函数的实现。该函数输出动态内容。
我们的 web 服务器代码的第四部分处理命令行参数和定义支持的 URL:
func main() {
PORT := ":8001"
arguments := os.Args
if len(arguments) == 1 {
fmt.Println("Using default port number: ", PORT)
}else{
PORT = ":" + arguments[1]
}
http.HandleFunc("/time", timeHandler)
http.HandleFunc("/", myHandler)
http.HandleFunc()
函数把一个URL和一个处理函数关联起来。
www.go
程序的最后一段如下:
err := http.ListenAndServe(PORT, nil)
if err != nil {
fmt.Println(err)
return
}
}
您将在 http.ListenAndServe()
函数的帮助下使用期望的端口号启动 web 服务器。
执行 www.go
并连接 web 服务器将生成如下输出:
$ go run www.go
Using default port number: :8001
Served: localhost:8001
Served: localhost:8001
Served time for: localhost:8001
Served: localhost:8001
Served time for: localhost:8001
Served: localhost:8001
Served time for: localhost:8001
Served: localhost:8001
Served: localhost:8001
Served: localhost:8001
尽管这个程序的输出提供了一些方便的信息,但我想您更愿意用您喜欢的浏览器看到真正的输出。下面的截图显示了我们的 web 服务器的 myhandler()
函数的输出,显示在 Google Chrome:
下面的截图显示 www.go
也能生成动态页面。在这个例子,它是注册在 /time
下的 web 页面,显示当前时间和日期:
这里真正有趣的是除了 /time
所有的 URL 都由 myHandler()
函数处理,因为它是 /
的第一个参数,匹配所有没有与另一个 handler 匹配的 URL。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论