Go 每日一库之 gorilla/schema

gorm源码阅读之Schema编程 总结起来,GORM提供了强大的Schema编程功能,使我们能够通过代码定义和管理数据库模式。它的自动迁移功能简化了表的创建和更新过程,而丰富的模式管理方法使得高级模式操作变得轻松。通过深入研究GORM的源代码,我们可以更好地理解其实现原理,并根据自己的需求扩展和定制库的功能。上述代码将创建一个名为"users"的表,并根据结构体字段的定义创建相应的列。在上面的代码中,我们定义了一个名为User的结构体,它对应于数据库中的一个表。上述代码将创建一个名为"my_users"的表,而不是默认的"users"表。 阅读详情

简介

gorilla/schema 是 gorilla 开发工具包中用于处理表单的库。它提供了一个简单的方式,可以很方便地将表单数据转为结构体对象,或者将结构体对象转为表单数据。

快速使用

本文代码使用 Go Modules。

创建目录并初始化:

$ mkdir gorilla/schema && cd gorilla/schema
$ go mod init github.com/darjun/go-daily-lib/gorilla/schema

安装gorilla/schema库:

$ go get -u github.com/gorilla/schema

我们还是拿前面登录的例子:

func index(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintln(w, "Hello World")
}

func login(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintln(w, `<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Login</title>
</head>
<body>
<form action="/login" method="post">
  <label>Username:</label>
  <input name="username"><br>
  <label>Password:</label>
  <input name="password" type="password"><br>
  <button type="submit">登录</button>
</form>
</body>
</html>`)
}

type User struct {
  Username string `schema:"username"`
  Password string `schema:"password"`
}

var (
  decoder = schema.NewDecoder()
)

func dologin(w http.ResponseWriter, r *http.Request) {
  r.ParseForm()
  u := User{}
  decoder.Decode(&u, r.PostForm)
  if u.Username == "dj" && u.Password == "handsome" {
    http.Redirect(w, r, "/", 301)
    return
  }

  http.Redirect(w, r, "/login", 301)
}

func main() {
  r := mux.NewRouter()
  r.HandleFunc("/", index)
  r.Handle("/login", handlers.MethodHandler{
    "GET":  http.HandlerFunc(login),
    "POST": http.HandlerFunc(dologin),
  })
  log.Fatal(http.ListenAndServe(":8080", r))
}

首先调用schema.NewDecoder()方法创建一个解码器decoder。在处理器中,先调用r.ParseForm()解析表单数据,然后创建用户对象u,调用decoder.Decode(&u, r.PostForm)通过表单数据填充该对象。

schema使用反射来对应表单和结构体字段,我们可以通过结构体标签来指定表单数据和字段的对应关系。

上面我们将解码器作为一个包内的全局变量,因为decoder中会缓存一些结构体的元数据,并且它是并发安全的。

在main函数中,我们创建了gorilla/mux路由,注册/根处理函数,使用中间件handlers.MethodHandler分别注册路径/login的 GET 和 POST 方法的处理器。然后调用http.Handle("/", r)将所有请求交由gorilla/mux路由处理。最后启动 Web 服务器接受请求。

编码

除了用于服务器解码表单数据外,schema还可用于客户端,将结构体对象编码到表单数据中发送给服务器。我们编写一个程序登录上面的服务器:

var (
  encoder = schema.NewEncoder()
)

func main() {
  client := &http.Client{}
  form := url.Values{}

  u := &User{
    Username: "dj",
    Password: "handsome",
  }
  encoder.Encode(u, form)

  res, _ := client.PostForm("http://localhost:8080/login", form)
  data, _ := ioutil.ReadAll(res.Body)
  fmt.Println(string(data))
  res.Body.Close()
}

与解码器的用法类似,首先调用schema.NewEncoder()创建一个编码器encoder,创建一个User类型的对象u和表单数据对象form,调用encoder.Encode(u, form)将u编码到form中。然后使用http.Client的PostForm方法发送请求。读取响应。

自定义类型转换

目前schema支持以下类型:

  • 布尔类型:bool

  • 浮点数:float32/float64

  • 有符号整数:int/int8/int32/int64

  • 无符号整数:uint/uint8/uint32/uint64

  • 字符串:string

  • 结构体:由以上类型组成的结构体

  • 指针:指向以上类型的指针

  • 切片:元素为以上类型的切片,或指向切片的指针

有时候客户端会将一个切片拼成一个字符串传到服务器,服务器收到之后需要解析成切片:

type Person struct {
  Name    string   `schema:"name"`
  Age     int      `schema:"age"`
  Hobbies []string `schema:"hobbies"`
}

var (
  decoder = schema.NewDecoder()
)

func init() {
  decoder.RegisterConverter([]string{}, func(s string) reflect.Value {
    return reflect.ValueOf(strings.Split(s, ","))
  })
}

func doinfo(w http.ResponseWriter, r *http.Request) {
  r.ParseForm()
  p := Person{}
  decoder.Decode(&p, r.PostForm)

  fmt.Println(p)
  fmt.Fprintf(w, "Name:%s Age:%d Hobbies:%v", p.Name, p.Age, p.Hobbies)
}

调用decoder.RegisterConverter()注册对应类型的转换函数,转换函数类型为:

func(s string) reflect.Value

即将请求中的字符串值转为满足我们格式的值。

客户端请求:

type Person struct {
  Name    string `schema:"name"`
  Age     int    `schema:"age"`
  Hobbies string `schema:"hobbies"`
}

var (
  encoder = schema.NewEncoder()
)

func main() {
  client := &http.Client{}
  form := url.Values{}

  p := &Person{
    Name:    "dj",
    Age:     18,
    Hobbies: "Game,Programming",
  }
  encoder.Encode(p, form)

  res, _ := client.PostForm("http://localhost:8080/info", form)
  data, _ := ioutil.ReadAll(res.Body)
  fmt.Println(string(data))
  res.Body.Close()
}

客户端故意将Hobbies字段设置为字符串,发送请求。服务器将使用注册的func (s string) reflect.Value函数将该字符串切割为[]string返回。

总结

schema提供了一个简单的获取表单数据的方式,通过将数据填充到结构体对象中,我们可以很方便的进行后续操作。schema库比较小巧,对特性没太多要求的可以试试~

大家如果发现好玩、好用的 Go 语言库,欢迎到 Go 每日一库 GitHub 上提交 issue????

参考

  1. gorilla/schema GitHub:github.com/gorilla/schema

  2. Go 每日一库 GitHub:https://github.com/darjun/go-daily-lib

我

我的博客:https://darjun.github.io

欢迎关注我的微信公众号【GoUpUp】,共同学习,一起进步~

Go实战--Gorilla web toolkit使用之gorilla/handlers 2018 就这么来了。苍老师也宣布结婚了。 黑龙江又一次火了:亚布力、雪乡宰客、林业大学学生车祸2017年12月份,tiobe上golang语言势头稍有下降。whatever 生命不止,继续 go go go !!!之前介绍过: Go实战–Gorilla web toolkit使用之gorilla/sessions(iris+sessions) Go实战–Gorilla web toolki 阅读详情

相关推荐

goschema:JSON 验证和操作

去模式 使用 go struct 标签验证 JSON 数据并将其更改为结构的库。 旨在替代 json.Marshal/json.Unmarshal。 旨在帮助将未结构化的 json 规范化和变异为适合存储的基于架构的结构化格式。 go get github.com/Sdedelbrock/goschema ##用法 package main import ( "github.com/Sdedelbrock/goschema" "fmt" ) type Person struct { // req means this field is required, if it is not present it will throw an error FirstName string `json:"first-name" schema:"req"` // truncate(n) wi

Form表单映射到 Go 结构体

Form表单映射到 Go 结构体 一、gorilla/schema ​ gorilla/schema可将前端传来的form表单自动映射到go语言的结构体上。可简化Golang后端对form表单各个属性值的获取,支持的参数类型如下: bool float variants (float32, float64) int variants (int, int8, int16, int32, int64) string uint variants (uint, uint8, uint16, uint32, uin

JTao539的博客 2387

Go-GoScheme-只是用Go编写的另一个Scheme解释器

GoScheme - 只是用Go编写的另一个Scheme解释器

如何在Linux上优雅运行Windows应用?WinBoat带来无缝体验

你是否曾在Linux环境中渴望使用某个仅支持Windows的专业软件?或者需要在开发工作流中临时运行某些Windows工具?传统解决方案要么依赖复杂的虚拟机,要么需要双系统切换,体验割裂且资源消耗大。WinBoat项目应运而生,它通过容器化技术让Windows应用在Linux系统中获得原生般的运行体验。 ## 核心理念:容器化融合而非模拟 WinBoat的核心创新在于采用Docker容器技术运

gitblog_00052的博客 494

[Linux项目实践] LCD Panel的硬件分析及调试

LCD硬件分析 项目使用3.5” TFT-LCD并且支持触摸控制。LCD的硬件可从几个方面学习:1)查看LCD的硬件连线。2)查看数据手册了解寄存器的控制。3)查看LCD DATASHEET了解硬件操作 1)LCD硬件连线 在图中有33个引脚,22根数据引脚和9根控制引脚。 LCD的工作原理:像素点是从左至右,从上至下逐个显示,LCD控制寄存器会从从内存中的framebuffer通

Terry_Yuan的技术专栏 3024

lattice 黑盒子的生成和使用(Creating Your Own Black Box Modules)

很多客户,特别是外包项目,需要做黑盒子,防止他人看到源码,那么这就需要对相关的源码打包加封了。diamond help 说的也是模糊模糊的,这次给出实际验证过的流程。 1.先将要加封的模块间一个工程,建好工程,写好代码之后,模块名字叫做crosslink(这个使用黑盒子的时候要用),代码如下: module crosslink( output wire[3:0] led, input wire clk, input wire reset ); reg [29:0] cnt; reg [3:0] led1;

qq_39633876的博客 1481

如何快速解决AlphaFold蛋白质结构预测的7大常见错误:终极排查指南

AlphaFold作为革命性的蛋白质结构预测工具,为生物信息学研究者带来了前所未有的便利。然而,从环境配置到模型运行的整个过程中,你可能会遇到各种令人沮丧的错误。本文将为你提供一套完整的AlphaFold错误排查方案,让你快速定位问题并高效解决。 ## 快速诊断流程图:3步定位问题根源 遇到AlphaFold错误时,不要慌张!按照下面的流程图快速定位问题: ```mermaid graph

gitblog_00050的博客 654

OpenCV实战:如何用Debevec算法搞定相机响应函数(附完整代码)

本文详细介绍了如何使用OpenCV实现Debevec算法计算相机响应函数(CRF),并应用于HDR图像合成。通过完整的代码示例和工程实践问题解决方案,帮助开发者掌握从原理到实现的关键步骤,提升高动态范围成像和计算机视觉任务的处理能力。

weixin_29061041的博客 230

如何用Summarize快速分析法律文档?条款提取与关键信息总结指南

你是否曾被冗长的法律合同、复杂的条款文档搞得头晕眼花?🤯 今天我要介绍一个强大的开源工具——Summarize,它能帮你快速理解法律文档的核心内容,提取关键条款,生成清晰易懂的总结。无论你是律师、法务人员还是普通用户,这个工具都能大幅提升你的文档处理效率。 Summarize是一款智能摘要工具,支持PDF、网页、音频、视频等多种格式,特别适合处理复杂的法律文档。它利用先进的AI模型自动分析文档

gitblog_00501的博客 613

BugkuCTF-PWN题pwn2-overflow超详细讲解

解题思路 1)计算出get_shell_的地址偏移量 2)算出来之后就直接溢出到后门函数 知识点 x64函数调用规则 解题之前我们先学下linux x64的函数调用规则。 x64机器在调用某个函数前,比如int func(int a, int b, int c, int d, int e, int f, int g, int h),首先他会把前6个参数从左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9,其余参数存入到栈里,保存的顺序是从右往左入栈。比如abcdef会存入到寄存器里,然后一次入栈h

am_03的博客 3013

学习笔记:TF卡启动荔枝派Nano(全志F1C200S)

荔枝派Nano编译Kernel报错报错内容如下编译烧录 报错内容如下 No controllers found No ethernet found. 从这些报错我真没看从出啥问题,也是在网上找,说是没有找到flash,是因为淘宝买的板子更换了flash,需要在u-boot里面重新适配型号: 板子的型号为xt25f128,但是实际u-boot的配置里面不是需要重新更改: u-boot/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts &spi0 { pin

热爱科技,物联,程序开发等 2133

彻底解决Go表单处理痛点:Gorilla/Schema零成本进阶指南

Gorilla/Schema是Go语言生态中一款高效的表单数据处理工具,能够将表单值自动填充到结构体中,彻底解决传统表单处理中重复繁琐的手动映射问题。无论是处理HTTP请求中的表单数据,还是解析复杂的表单结构,Gorilla/Schema都能提供简洁高效的解决方案,帮助开发者快速构建健壮的Web应用。 ## 为什么选择Gorilla/Schema? 在Go语言Web开发中,处理表单数据往往需要

gitblog_00399的博客 515

【基础-多选】HarmonyOS鸿蒙应用开发

1、HarmonyOS提供了基础的应用加固安全能力,包括混淆、加密和代码签名能力。正确2、可以通过ohpm uninstall 指令下载指定的三方库。错误3、支持模块化开发是指一个应用通常会包含多种功能,将不同的功能特性按模块来划分和管理是一种良好的设计方式。在开发过程中,我们可以将每个功能模块作为一个独立的Module进行开发,Module中可以包含源代码、资源文件、第三方库、配置文件等,每一个Module可以独立编译,实现特定的功能。这种模块化、松耦合的应用管理方式有助于应用的开发、维护与扩展。正确。

江拥羡橙的博客 1万+

如何使用Go语言进行JSON Schema验证?

在Go语言中进行JSON Schema验证通常涉及两个主要步骤:首先,你需要一个库来解析和验证JSON Schema;其次,你需要使用这个库来验证你的JSON数据是否符合给定的Schema。作为Schema和数据的类型,这意味着你可以验证任何JSON数据和任何Schema。在实际使用中,你可能需要根据你的具体需求来定义更具体的类型。在这个示例中,我们首先加载了JSON Schema和JSON数据,然后使用。函数来验证数据是否符合Schema。,它们提供了解析和验证JSON Schema的功能。

发现生活,分享智慧,一起成长! 979

【模型】OpenClaw 接入阿里云永久免费模型方案

Qwen2.5-7B-Instruct 模型为例。

海兰 4473

C#实现低通和高通滤波算法

低通滤波器允许通过低于某个截止频率的信号成分,并且抑制高于该频率的成分。而高通滤波器则允许通过高于某个截止频率的信号成分,并抑制低于该频率的成分。巴特沃斯滤波器是一种对称的滤波器,具有平坦的幅度响应和最小的群延迟。低通和高通滤波是数字信号处理中常用的滤波技术,用于滤除或增强信号中的特定频率成分。在本篇文章中,我们将使用C#编程语言来实现低通和高通滤波算法。以上就是使用C#实现低通和高通滤波算法的示例代码。你可以根据自己的需求调整截止频率和采样率,将这些代码应用于你的项目中。是滤波器的截止频率,

XisVisual_Basic的博客 1275

探索高效强大的Go语言JSON Schema库 —— gojsonschema

探索高效强大的Go语言JSON Schema库 —— gojsonschema 去发现同类优质开源项目:https://gitcode.com/ 在处理JSON数据时,验证其符合预定义的结构规范至关重要。gojsonschema是一个为Go编程语言量身定制的JSON Schema实现,它支持draft-04,draft-06和draft-07,为你的项目提供了可靠的数据校验功能。 项目介绍 goj...

gitblog_00005的博客 1014

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

优秀 Go 项目介绍: Gorilla web toolkit

为什么80%的码农都做不了架构师?>>> ...

weixin_34392435的博客 262

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【GO】Iris框架项目初始化并解决GoLand的代码提示问题

为什么使用Iris 因为它是少数Go框架中支持MVC的框架,并且是最快的go框架 具体操作 创建项目 创建项目 IDE采用goland,直接选择第一个来创建项目 初始化mod go mod 可以让你摆脱GOPATH对项目的约束,同时也是解决GoLand问题的核心 export GO111MODULE=on lixiaoyu@localhost projectApi % go mod init projectApi go: creating new go.mod: module projectApi 引入

Code Metaverse 2906

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

gorilla/sessions 学习笔记

简单样例 多session的处理 复杂结构数据 key的更换

KingEasternSun的专栏 4246

如何快速构建实时应用:Gorilla WebSocket 完整指南

Gorilla WebSocket 是一个快速、经过充分测试且广泛使用的 Go 语言 WebSocket 实现。它为开发者提供了构建实时应用的强大工具,能够轻松实现客户端与服务器之间的双向通信。 ## 什么是 WebSocket? WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。与传统的 HTTP 请求不同,WebSocket 允许服务器主动向客户端推送数据,这使得它非常

gitblog_00287的博客 741

Go 语言 Web 工具包 Gorilla 宣布已正式归档

流行的开源 Go 语言 Web 工具包 Gorilla 宣布已正式归档,目前已进入只读模式。“它发出的信号是,这些库在未来将不会有任何发展。”

weixin_56035688的博客 294

golang 宝藏库推荐—gojsonschema

文章目录1. 写在最前面2. Json schema 介绍2.1 Json schema 是什么2.2 使用 Json schema 的优势2.3 Json schema 关键字说明2.4 Json schema 常用的在线工具3. 例子3.1 使用上述关键字的 json shema3.2 定义一个符合 schema 的 json4. 使用 gojsonschema 的完成上述校验4.1 目录结构定义4.2 校验代码4.3 试试错误的 json5. 碎碎念6. 参考资料 1. 写在最前面 笔者之前写过一.

phantom_111的博客 4312

【Golang】json数据解码的两种方法NewDecoder与Unmarshal

一、golang中处理http响应数据解码,一般有两种方式: 1:json.Unmarshal进行解码 func HandleUse(w http.ResponseWriter, r *http.Request) { var u Use //此处的Use是一个结构体 data, err := ioutil.ReadAll(r.Body)//此处的r是http请求得到的json格式数据-->然后转化为[]byte格式数据. if err != nil { w.Wr

郝同学的博客 1万+

schema学习系列五: schema校验

检查文档是否遵循了模式中规定的规则。不同的解析器和工具支持不同的模式语言如  DTD 、 W3C XML Schema  语言、 RELAX NG  和  Schematron 。 Java 5™  增加了统一的验证应用程序编程接口( API ),可以 把文档和用这种或那种语言编写的模式作比较。了解这种  XML  验证  API 。 验证是一种强大的工具。它可以快速检查...

ReeBoo 2390
上一篇: Go 每日一库之 gorilla/handlers
下一篇: Go 每日一库之 gorilla/securecookie
darjun
博客等级 码龄10年 109粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值