前情提要:
需要安装好go的环境和VSCode的go插件。
hello world快速上手
1、创建go.mod
在项目根目录下打开命令行,或者直接用VSCode中的终端。输入命令
go mod init github.com/solenovex/web-tutorial
然后就能看到项目结构中多了一个go.mod
2、编写main.go
package main
import "net/http"
func main() {
//HandleFunc有两个参数,第一个参数相当于一个路由地址。写“/”表示监听的根地址
//第二个参数是个回调函数。函数内也有两个参数,第一个参数w是用来写响应的
//第二个参数r会把传入请求的所有信息都包裹在里面。
http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello world"))
})
//监听请求的地址和端口 相当于一个路由器
http.ListenAndServe("localhost:8080", nil)
}
3、go run main.go运行项目
在项目根目录下打开命令行,或者直接用VSCode中的终端。输入命令:
go run main.go
然后打开浏览器输入相应地址,可以看到hello world。
http.Server:
http.Server 这是一个 struct,里面有若干字段。以下是常用字段
Addr 字段表示网络地址 如果为“”,那么就是所有网络接口的 80 端口
Handler 字段 如果为 nil,那么就是 DefaultServeMux ListenAndServe() 函数。
其封装好的语句为如下:
http.ListenAndServe("localhost:8080", nil)
底层源码如下:
server := http.Server{
Addr: "localhost:8080",
Handler: nil,
}
server.ListenAndServe()
所以这两种代码是等效的,第一种更简洁,第二种灵活性更强。
handler:
handler 是一个接口(interface)
handler 里面只定义了一个方法 ServeHTTP()
参数一:HTTPResponseWriter 参数二:指向 Request 这个 struct 的指针
源码: type Handler interface {ServeHTTP(ResponseWriter, *Request) }
package main
import "net/http"
type myHandler struct{}
func (m *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello world"))
}
func main() {
mh := myHandler{}
//以下五行就和http.ListenAndServe("localhost:8080", &mh)效果一样,是其源码。
server := http.Server{
Addr: "localhost:8080",
Handler: &mh,
}
server.ListenAndServe()
}
http.Handle:
该函数可以实现多个handler注册到DefaultServeMux上的效果,从而达到一个路径对应一个请求,一个处理逻辑:
package main
import "net/http"
type helloHandler struct{}
func (m *helloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello world"))
}
type aboutHandler struct{}
func (m *aboutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("about"))
}
func main() {
mh := helloHandler{}
ah := aboutHandler{}
server := http.Server{
Addr: "localhost:8080",
Handler: nil,
}
http.Handle("/hello", &mh)
http.Handle("/about", &ah)
server.ListenAndServe()
}
http.HandleFunc
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
package main
import "net/http"
func welcome(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("welcome"))
}
func main() {
server := http.Server{
Addr: "localhost:8080",
Handler: nil,
}
http.HandleFunc("/home", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("home"))
})
http.HandleFunc("/welcome", welcome)
//相当于http.Handle("/welcome", http.HandlerFunc(welcome))
server.ListenAndServe()
}
ps:Go 有一个函数类型:HandlerFunc。可以将某个具有适当签名的函数 f,适配成为一个 Handler,而这个 Handler 具有方法 f。
两者区别: