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

前情提要:

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

hello world快速上手

1、创建go.mod

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

go mod init github.com/solenovex/web-tutorial

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

2、编写main.go

package mainimport 	"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 mainimport "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 mainimport "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 mainimport "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。

两者区别:


​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/97896.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CRM 自动化如何改善销售和客户服务?

许多 B2B 和 B2C 公司都使用 CRM 系统来组织业务流程,使复杂的任务更容易完成。企业可以使用 CRM 自动化来自动化工作流程,让团队有更多的时间来执行高价值的任务,而不是陷于一堆琐碎事情中。 什么是CRM自动化? CRM 自动化是指 C…

uni-app 之 安装uView,安装scss/sass编译

uni-app 之 安装uView,安装scss/sass编译 image.png image.png image.png 点击HBuilder X 顶部,工具,插件安装,安装新插件 image.png image.png 安装成功! 注意,一定要先登录才可以安装 image.png 1. 引…

01. Kubernetes基础入门

目录 1、前言 2、Kubernetes介绍 2.1、什么是Kubernetes 2.2、主要功能 2.3、与Docker的关系 2.4、Kubernetes集群架构体系 3、Kubernetes组件 3.1、核心组件 3.2、附加组件 4、Kubernetes对象 4.1、对象管理 4.2、命名空间 4.3、标签 1、前言 Docker 容器技术将…

【动态规划】面试题 08.01. 三步问题

Halo,这里是Ppeua。平时主要更新C,数据结构算法,Linux与ROS…感兴趣就关注我bua! 文章目录 0. 题目解析1. 算法原理1.1 状态表示1.2 状态转移方程1.3初始化1.4 填表顺序1.5 返回值 2.算法代码 🐧 本篇是整个动态规划的…

失效的访问控制及漏洞复现

失效的访问控制(越权) 1. 失效的访问控制(越权) 1.1 OWASP TOP10 1.1.1 A5:2017-Broken Access Control 未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据,例如:访问其他用户的帐户、查看敏感文件、修改其…

链路追踪Skywalking应用实战

目录 1 Skywalking应用2 agent下载3 agent应用3.1 应用名配置3.2 IDEA集成使用agent3.3 生产环境使用agent 4 Rocketbot4.1 Rocketbot-仪表盘4.2 Rocketbot-拓扑图4.3 追踪4.4 性能分析4.5 告警4.5.1 警告规则详解4.5.2 Webhook规则4.5.3 自定义Webhook消息接收 1 Skywalking应…

Web前端开发概述

Web(World Wide Web,全球广域网)是指一种基于互联网的信息系统,通过超文本链接将全球各地的文档、图像、视频等资源相互关联起来,并通过Web浏览器进行交互浏览和访问。Web的发展使得人们可以方便地获取和共享各种类型的…

面试总结 - 计算机网络

计算机网络 1 OSI 七层模型 | TCP与UDP | 响应状态码 OSI 模型 应用层: 计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。 HTTP SMTP FTP DNS 表示层: 负责数据格式的转换&…

【内网穿透】使用Nodejs搭建简单的HTTP服务器 ,并实现公网远程访问

目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation…

一种结合白平衡统计信息和曝光信息的软光敏算法专利学习(专利三)

基础理论: 亮度计算: 对于白天模式而言,IR滤光片处于过滤红外光的状态,也就是说,摄像机的感光芯片所感受到的环境光中的红外光几乎为零;而对于夜晚模式而言,IR滤光片处于不过滤红外光的状态&am…

什么是瓷片电容封装 | 百能云芯

瓷片电容封装是一种常见的电子元件封装方式,它广泛应用在电子设备中,用于存储和释放电荷,以实现电路的稳定工作。在本文中,我们将详细介绍瓷片电容封装的特点以及用途。 瓷片电容封装的特点: 瓷片电容是一种以陶瓷材料…

VB.NET 如何将某个Excel的工作表中复制到另一个的Excel中的工作表中https://bbs.csdn.net/topics/392861034

参考http://share.freesion.com/306372/可以实现直接拷贝指定表 Private Sub Excel复制工作簿()Dim myExcelApp As New Microsoft.Office.Interop.Excel.ApplicationmyExcelApp.Workbooks.Open(System.Environment.CurrentDirectory "\\测试用例.xlsx", Type.Missin…