go web之一:hello world快速上手+handle(http.Handle和http.HandleFunc的区别与联系)

前情提要:

需要安装好go的环境和VSCode的go插件。

hello world快速上手

1、创建go.mod

在项目根目录下打开命令行,或者直接用VSCode中的终端。输入命令

bash 复制代码
go mod init github.com/solenovex/web-tutorial

然后就能看到项目结构中多了一个go.mod

2、编写main.go

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中的终端。输入命令:

bash 复制代码
go run main.go

然后打开浏览器输入相应地址,可以看到hello world。

http.Server:

http.Server 这是一个 struct,里面有若干字段。以下是常用字段

Addr 字段表示网络地址 如果为"",那么就是所有网络接口的 80 端口

Handler 字段 如果为 nil,那么就是 DefaultServeMux ListenAndServe() 函数。

其封装好的语句为如下:

Go 复制代码
http.ListenAndServe("localhost:8080", nil)

底层源码如下:

Go 复制代码
server := http.Server{
   Addr:    "localhost:8080",
   Handler: nil,
}
server.ListenAndServe()

所以这两种代码是等效的,第一种更简洁,第二种灵活性更强。

handler:

handler 是一个接口(interface)

handler 里面只定义了一个方法 ServeHTTP()

参数一:HTTPResponseWriter 参数二:指向 Request 这个 struct 的指针

源码: type Handler interface {ServeHTTP(ResponseWriter, *Request) }

Go 复制代码
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上的效果,从而达到一个路径对应一个请求,一个处理逻辑:

Go 复制代码
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))

Go 复制代码
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。

两者区别:

​​​​​​​

相关推荐
心平气和量大福大8 分钟前
C#-WPF-Window主窗体
开发语言·c#·wpf
Conan在掘金22 分钟前
鸿蒙报错速查:arkts-strict-typing Property does not exist on type 'object',object 装函数就炸,根因 + 真解法
后端
颜酱27 分钟前
01 | 骨架搭建:FastAPI + Vue 跑通第一个 SSE 流式问答
前端·人工智能·后端
程序员cxuan1 小时前
Grok Build 被众人唾骂,结果老马把它开源了
人工智能·后端·程序员
从零开始的代码生活_1 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸1 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
Conan在掘金2 小时前
�鸿蒙报错速查:Cannot find name 'require',禁用 require(),根因 + 真解法
后端
隔窗听雨眠2 小时前
Spring Boot在云原生时代的编程范式革新研究
spring boot·后端·云原生
一朵小花2 小时前
记一次Docker 容器 NFS 文件写入延迟排查过程
后端
GIS阵地2 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis