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的更多相关文章

  1. 从源码对比DefaultServeMux 与 gorilla/mux

    从源码对比DefaultServeMux 与 gorilla/mux DefaultServeMux Golang自带的net/http库中包含了DefaultServeMux方法,以此可以搭建一个稳 ...

  2. gorilla/mux类库解析

    golang自带的http.SeverMux路由实现简单,本质是一个map[string]Handler,是请求路径与该路径对应的处理函数的映射关系.实现简单功能也比较单一: 不支持正则路由, 这个是 ...

  3. gorilla/mux 的学习

    原文链接:gorilla/mux的学习 源代码: package main import ( "encoding/json" "fmt" "githu ...

  4. Golang实现requests库

    Golang实现requests库 简单的封装下,方便使用,像python的requests库一样. Github地址 Github 支持 GET.POST.PUT.DELETE applicatio ...

  5. Golang学习---常用库

    1. 路由库:github.com/julienschmidt/httprouter 2. mysql驱动:github.com/go-sql-driver/mysql

  6. Golang 的 TOML库

    TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner. TOML 的目标是成为一个极简的配 ...

  7. 『Golang』—— 标准库之 os

    Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path s ...

  8. Golang编写动态库实现回调函数

    Golang编写动态库实现回调函数 我们现在要做一个动态库,但是C++实在是比较难,于是就想能不能用更简单的golang来实现,golang也就是最近的版本才支持编译成动态库,在网上也没找到可用的案例 ...

  9. Golang内建库学习笔记(2)-web服务器相关

    package main import ( "net/http" "fmt" "strings" "log" ) fun ...

  10. golang自定义路由控制实现(一)

        由于本人之前一直是Java Coder,在Java web开发中其实大家都很依赖框架,所以当在学习Golang的时候,自己便想着在Go开发中脱离框架,自己动手造框架来练习.通过学习借鉴Java ...

随机推荐

  1. git 乱操作

    https://www.cnblogs.com/qybk/p/10880901.html 错误提示一样,只是我是在我自己的分支(xxx_dev)里.所以以下要改一下. git pull origin ...

  2. docker启动问题: Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

    系统环境:centos 7 docker版本:Docker version 26.1.4, build 5650f9b 问题:Job for docker.service failed because ...

  3. LinkedHashMap原理详解—从LRU缓存机制说起

    写在前面 从一道Leetcode题目说起 首先,来看一下Leetcode里面的一道经典题目:146.LRU缓存机制,题目描述如下: 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结 ...

  4. DatetimeFormatter字符串转日期

    在Java中,我们经常需要将字符串形式的日期时间转换为LocalDateTime.LocalDate.LocalTime等日期时间对象,或者将日期时间对象转换为字符串.为了完成这些操作,我们可以使用D ...

  5. C++ STL queue容器——队列

    queue容器 基本概念 queue是一种**先进先出的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素. queue容器没有迭代器,所有元素进出都必须符合"先进先 ...

  6. 了解 Flutter 3.16 功能更新

    作者 / Kevin Chisholm 我们在季度 Flutter 稳定版发布会上带来了 Flutter 3.16,此版本包含诸多更新: Material 3 成为新的默认主题.为 Android 带 ...

  7. C#上位机与PLC通信心跳的实现方法

    -Begin- 大家好!我是付工.众所周知,在工业自动化控制系统中,上位机与下位机之间的通信是实现自动化生产的关键环节之一.为了确保通信的稳定性和可靠性,我们通用会采用一种被称为[心跳机制]的方法,它 ...

  8. 林史·CLOI纪事本末

    CLOI正源在JD,JD在初次短期集训结束后带出了一句经典名言: 那如果是在丛林里呢 这句话在短期内在全班范围内流传甚广,因此,\(GreatJungleLord\) 也因其幽默诙谐的形象赢得了大家的 ...

  9. 交通网络分析性能再升级,SuperMap iServer新增开启SSC分析模型

    导语 SSC分析模型,全名SuperMap Short Cut,底层采用Contraction Hierarchies(简称CH)算法,该算法旨在通过对图形进行预处理和优化来降低最佳路径分析的时间复杂 ...

  10. SpringBoot创建微服务项目

    下载安装并配置git 为自己的git设置名字 git config --global user.name "XXX" 配置自己注册码云的邮箱 git config --global ...