golang之路由库gorilla/mux
gorilla/mux是 gorilla Web 开发工具包中的路由管理库。gorilla Web 开发包是 Go 语言中辅助开发 Web 服务器的工具包。它包括 Web 服务器开发的各个方面,
有表单数据处理包gorilla/schema,
有 websocket 通信包gorilla/websocket,
有各种中间件的包gorilla/handlers,
有 session 管理包gorilla/sessions,
有安全的 cookie 包gorilla/securecookie
mux有以下优势:
- 实现了标准的
http.Handler接口,所以可以与net/http标准库结合使用,非常轻量; - 可以根据请求的主机名、路径、路径前缀、协议、HTTP 首部、查询字符串和 HTTP 方法匹配处理器,还可以自定义匹配逻辑;
- 可以在主机名、路径和请求参数中使用变量,还可以为之指定一个正则表达式;
- 可以传入参数给指定的处理器让其构造出完整的 URL;
- 支持路由分组,方便管理和维护。
快速使用
本文代码使用 Go Modules。
创建目录并初始化:
$ mkdir -p gorilla/mux && cd gorilla/mux
$ go mod init github.com/darjun/go-daily-lib/gorilla/mux
安装gorilla/mux库:
go get -u github.com/gorilla/gorilla/mux
下面我们编写一个管理图书信息的 Web 服务。图书由 ISBN 唯一标识,ISBN 意为国际标准图书编号(International Standard Book Number)。
首先定义图书的结构:
type Book struct {
ISBN string `json:"isbn"`
Name string `json:"name"`
Authors []string `json:"authors"`
Press string `json:"press"`
PublishedAt string `json:"published_at"`
}
var (
mapBooks map[string]*Book
slcBooks []*Book
)
定义init()函数,从文件中加载数据:
func init() {
mapBooks = make(map[string]*Book)
slcBooks = make([]*Book, 0, 1)
data, err := ioutil.ReadFile("../data/books.json")
if err != nil {
log.Fatalf("failed to read book.json:%v", err)
}
err = json.Unmarshal(data, &slcBooks)
if err != nil {
log.Fatalf("failed to unmarshal books:%v", err)
}
for _, book := range slcBooks {
mapBooks[book.ISBN] = book
}
}
然后是两个处理函数,分别用于返回整个列表和某一本具体的图书:
func BooksHandler(w http.ResponseWriter, r *http.Request) {
enc := json.NewEncoder(w)
enc.Encode(slcBooks)
}
func BookHandler(w http.ResponseWriter, r *http.Request) {
book, ok := mapBooks[mux.Vars(r)["isbn"]]
if !ok {
http.NotFound(w, r)
return
}
enc := json.NewEncoder(w)
enc.Encode(book)
}
注册处理器:
func main() {
r := mux.NewRouter()
r.HandleFunc("/", BooksHandler)
r.HandleFunc("/books/{isbn}", BookHandler)
http.Handle("/", r)
log.Fatal(http.ListenAndServe(":8080", nil))
}
mux的使用与net/http非常类似。首先调用mux.NewRouter()创建一个类型为*mux.Router的路由对象,该路由对象注册处理器的方式与标准库的*http.ServeMux完全相同,即调用HandleFunc()方法注册类型为func(http.ResponseWriter, *http.Request)的处理函数,调用Handle()方法注册实现了http.Handler接口的处理器对象。上面注册了两个处理函数,一个是显示图书信息列表,一个显示具体某本书的信息。
注意到路径/books/{isbn}使用了变量,在{}中间指定变量名,它可以匹配路径中的特定部分。在处理函数中通过mux.Vars(r)获取请求r的路由变量,返回map[string]string,后续可以用变量名访问。如上面的BookHandler中对变量isbn的访问。
由于*mux.Router也实现了http.Handler接口,所以可以直接将它作为http.Handle("/", r)的处理器对象参数注册。这里注册的是根路径/,相当于把所有请求的处理都托管给了*mux.Router。
最后还是http.ListenAndServe(":8080", nil)开启一个 Web 服务器,等待接收请求。
更多参考: https://darjun.github.io/2021/07/19/godailylib/gorilla/mux/
golang之路由库gorilla/mux的更多相关文章
- 从源码对比DefaultServeMux 与 gorilla/mux
从源码对比DefaultServeMux 与 gorilla/mux DefaultServeMux Golang自带的net/http库中包含了DefaultServeMux方法,以此可以搭建一个稳 ...
- gorilla/mux类库解析
golang自带的http.SeverMux路由实现简单,本质是一个map[string]Handler,是请求路径与该路径对应的处理函数的映射关系.实现简单功能也比较单一: 不支持正则路由, 这个是 ...
- gorilla/mux 的学习
原文链接:gorilla/mux的学习 源代码: package main import ( "encoding/json" "fmt" "githu ...
- Golang实现requests库
Golang实现requests库 简单的封装下,方便使用,像python的requests库一样. Github地址 Github 支持 GET.POST.PUT.DELETE applicatio ...
- Golang学习---常用库
1. 路由库:github.com/julienschmidt/httprouter 2. mysql驱动:github.com/go-sql-driver/mysql
- Golang 的 TOML库
TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner. TOML 的目标是成为一个极简的配 ...
- 『Golang』—— 标准库之 os
Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path s ...
- Golang编写动态库实现回调函数
Golang编写动态库实现回调函数 我们现在要做一个动态库,但是C++实在是比较难,于是就想能不能用更简单的golang来实现,golang也就是最近的版本才支持编译成动态库,在网上也没找到可用的案例 ...
- Golang内建库学习笔记(2)-web服务器相关
package main import ( "net/http" "fmt" "strings" "log" ) fun ...
- golang自定义路由控制实现(一)
由于本人之前一直是Java Coder,在Java web开发中其实大家都很依赖框架,所以当在学习Golang的时候,自己便想着在Go开发中脱离框架,自己动手造框架来练习.通过学习借鉴Java ...
随机推荐
- 【YashanDB知识库】ODBC驱动类问题定位方法
[标题]ODBC驱动类问题定位方法 [需求分类]故障分析 [关键字]ODBC [需求描述]由于我们的ODBC接口目前尚不完善,经常会遇见ODBC接口能力不足导致应用功能无法运行的问题,需要定位手段确定 ...
- attention, transformers
这啥呀,慢慢啃 Attention 最初来源于 NLP 机器翻译的 Sequence to Sequence 模型,早先的encoder-decoder结构随着句子长度增加翻译性能会下降,因为模型记不 ...
- LCD屏幕显示PNG图像
正点原子LCD屏幕显示PNG图像 本文概要 这段时间在学习正点原子的IMX6ULL开发板,在应用编程中有一个代码练习是需要在LCD屏幕上显示PNG图像,但由于我的屏幕参数和教程中的有些出入,于是经过自 ...
- C++ : 仅添加一个引用& 就直接导致程序崩溃
问题描述 在项目某次开发中,测试过程中出现了coredump问题.经过asan工具检测,报了heap-use-after-free内存错误,最终定位到竟是无意中添加了一个引用&导致的! 开发时 ...
- Angular 18+ 高级教程 – 关于本教程
版本声明 本教程写于 Angular v17,但往后的所有新功能,API 都有更新到相关文章里头,所以教程总是最新的,大家可以安心学习. 前言 光阴飞逝,一转眼,我尽然已经有两年多的时间完全没有接触 ...
- Maven 使用方法
Maven Maven是一个项目管理工具,它包含了一个项目对象模型(POM:Project Object Model),其表现于一个XML文件(pom.xml),其中包含了项目的基本学习,依赖关系,插 ...
- Nuxt Kit API :路径解析工具
title: Nuxt Kit API :路径解析工具 date: 2024/9/22 updated: 2024/9/22 author: cmdragon excerpt: 摘要:本文介绍了Nux ...
- 面试官:谈谈你对 IoC 和 AOP 的理解!
本文摘录自笔者开源的 Java 学习&面试指南(Github 收获146k star):JavaGuide . 这篇文章会从下面从以下几个问题展开对 IoC & AOP 的解释 什么是 ...
- Docker基本概念(LXC?镜像、容器、仓库是什么?容器和虚拟机又是什么?)(一)
学习Docker前,我们有必要了解下Docker的前生LXC(Linux Container). 一.LXC介绍 LXC 可以提供轻量级的虚拟化,用来隔离进程和资源,和我们传统观念中的全虚拟化完全不一 ...
- 三,MyBatis-Plus 的各种查询的“超详细说明”,比如(等值查询,范围查询,模糊查询...)
三,MyBatis-Plus 的各种查询的"超详细说明",比如(等值查询,范围查询,模糊查询...) @ 目录 三,MyBatis-Plus 的各种查询的"超详细说明&q ...