Skip to content

一个简单的golang web服务

从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 下找到对应的可执行文件相关信息

daomin@haidao:/tmp/go-build3601556539/b001/exe$ ls -trl
total 4220
-rwxrwxr-x 1 daomin daomin 4321280 Mar  6 22:23 main

servemux

  • url的匹配模式是越长的优先匹配,和路由定义的顺序无关
  • 非常轻量级,不支持正则表达式、request method等特性
Published ingolang

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *