Golang(Handler入门)

我该如何对的起这句话呢?
熟练使用 Golang 进行 HTTP 服务开发,具备基础接口设计与健康检查实现经验

什么是HTTP?

这个我们都不陌生。TCP/UDP也知道吧。但是它们是如何实现的呢?

Gin用的太久了,很多底层的东西,我几乎不知道。

http服务,监听,处理。 监听路径,处理。

一个URL对应一个请求的处理器,构成了http请求的核心。

这就是http.Handle()的两个参数。

go 复制代码
func Handle(pattern string, handler Handler)

http.Handle是一切的起点。

pattern 是string,handler 的是Handler。

作为数据类型,string我们很好理解。但是Handler是什么呢?

我们来查看源码

go 复制代码
type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

显然,Handler 是一个接口。任何一个实现了ServeHTTP(ResponseWriter, *Request)方法且无返回值的数据type,都可以作为Handler 来使用。

这就是第一种做法。

go 复制代码
package main

import (
	"net/http"
)

type my_handler struct{}

func (f my_handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello World"))
}

func main() {
	http.Handle("/", my_handler{})
	http.ListenAndServe("0.0.0.0:8080", nil)
}

同时,如果我们只需要写对应的处理逻辑,而不需要一个具体的结构体,再实现ServeHTTP呢?

这就出来了第2种方法:

go 复制代码
// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// [Handler] that calls f.
type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
	f(w, r)
}

由于HandlerFunc 的特殊设计,导致我们可以将我们的具体的代码逻辑写成一个普通的函数,当然这个普通函数的函数签名和返回值与ServeHTTP一样。然后这个函数就可以作为HandlerFunc 的参数构建一个实例,这个实例就可以作为Handler 来使用。

go 复制代码
package main

import (
	"net/http"
)

func rootHandler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello World"))
}

func main() {
	http.Handle("/", http.HandlerFunc(rootHandler))
	http.ListenAndServe("0.0.0.0:8080", nil)
}

当然也可以直接写匿名函数:

go 复制代码
package main

import (
	"net/http"
)

func main() {
	http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello World"))
	}))
	http.ListenAndServe("0.0.0.0:8080", nil)
}

难道我们不能直接将普通函数作为参数传入吗?能不能再多封装一点方便我们做开发?

那就是第3种方法:

go 复制代码
package main

import (
	"net/http"
)

func rootHandler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello World"))
}

func main() {
	http.HandleFunc("/", rootHandler)
	http.ListenAndServe("0.0.0.0:8080", nil)
}

当然,我们也可以写匿名函数:

go 复制代码
package main

import (
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello World"))
	})
	http.ListenAndServe("0.0.0.0:8080", nil)
}
相关推荐
省四收割者17 小时前
从硬件中断到分布式协程:全景解构高并发机制与 C / Golang 的巅峰对决
c++·分布式·嵌入式硬件·golang
闫有尽意无琼17 小时前
qt控件未指定父对象或delete致堆内存泄露
开发语言·qt
Cx330❀17 小时前
【Linux网络】从零定制应用层协议:黏包问题、全双工缓冲区与 Jsoncpp 序列化深度解析
linux·运维·服务器·开发语言·网络·c++·人工智能
山东布谷网络科技17 小时前
海外直播语聊APP功能与UI升级的关键关注点
开发语言·ui·app store·谷歌上架·海外直播app开发·海外语聊平台搭建·多语言直播平台定制
江屿风17 小时前
C++图论基础Bellman-Ford与spfa算法如何判断负环
开发语言·c++·笔记·算法·图论
艾莉丝努力练剑17 小时前
【Linux网络】五种IO模型与非阻塞IO
linux·运维·服务器·开发语言·网络·tcp/ip
VidDown17 小时前
视频协议传输全解析:从 HTTP/HTTPS 到 HLS/DASH 的完整旅程
javascript·网络·http·https·编辑器·音视频·视频编解码
Dylan的码园17 小时前
python基础与快速入门
开发语言·python
zzz_236817 小时前
【Java基础】HashMap——为什么JDK 7扩容会死循环,JDK 8又是怎么修好的
java·开发语言
程序猿乐锅17 小时前
JavaSE 总复习:语法到多线程全梳理
java·开发语言