从HelloWorld开始
package main
import (
"log"
"net/http"
)
func home(w http.ResponseWriter, r \*http.Request) {
w.Write([]byte("Hello World!"))
}
func main() {
http.HandleFunc("/", home)
log.Println("Listening on:", 8000)
http.ListenAndServe(":8080", nil)
}
以上的写法,实际上是使用了默认的servemux
(DefaultServeMux),但这不是推荐的做法。因为它虽然简洁,但让你的代码可能让你的代码变得不够明确,更重要的是它存在安全问题。DefaultServeMux
保存在一个全局变量中,任何package
都可以访问它并注册route
。如果任何第三方的包有问题的话,它们可以使用默认的servemux
来暴露有问题的handler
。
使用NewServeMux
func main() {
// function to initialize a new servemux, then
// register the home function as the handler for the "/" URL pattern.
mux := http.NewServeMux()
mux.HandleFunc("/", home)
log.Println("Listening:", 8080)
err := http.ListenAndServe(":8080", mux)
log.Fatal(err)
}
So the better vers
其他说明
网络地址
例子中网络地址是:8080
,表示接受所有network interface
的请求,我们的服务器一般会有多个network interface
,如果你要限制在局域网访问,就需要限制接受的network interface
。比如192.168.1.100:8080
。这样外部就无法通过公网ip来访问你的服务了。
如果不使用数值端口,还可以使用named port
,如:http-alt
,相关的数据可以在/etc/services
这个文件中找到。
err := http.ListenAndServe(":http-alt", mux)
如果你使用go run
命令来运行程序,可以在/tmp
下找到对应的可执行文件相关信息
[email protected]:/tmp/go-build3601556539/b001/exe$ ls -trl
total 4220
-rwxrwxr-x 1 daomin daomin 4321280 Mar 6 22:23 main
servemux
- url的匹配模式是越长的优先匹配,和路由定义的顺序无关
- 非常轻量级,不支持正则表达式、request method等特性
Be First to Comment