Macaron的注入struct
2019独角兽企业重金招聘Python工程师标准>>>
#web服务器
浏览一个网页就像买啤酒,你给我钱(http请求),我给你啤酒(http返回)
web服务器就充当了营业员的角色
买啤酒从宏观来看,就2步,一手交钱一手交货。其实营业员在给你啤酒之前,还做了其他的事情,比如验钞和查看库存等。并且是有先后顺序的,一般是验钞通过后,再去查看库存。
web服务器也一样,它收到浏览器发来的请求后,会按预定设计的顺序来做一个一个的function,最后将处理的结果返回给浏览器。浏览器拿到返回的内容(html源码),就可以画在屏幕上给用户看了。
#macaron.Use
Use方法,就是用来注册一个一个的func的,这些func是全局的,也就是任何http请求过来,会最先调用这些func,以此执行。注册的顺序也就是执行的顺序。
Use方法可以使用多次,但每次只能注册一个func。
m.Use(func(){println(1)
})
m.Use(func(){println(2)
})
// 任何http请求过来,会先打印1,再打印2在控制台上
#macaron.Get
Get方法也是来注册与上面Use一样的func的,Get方法注册的func 会在 Use注册的func执行完毕后,再依次执行。
Get方法只能使用1次(相同pattern的情况下),可以同时注册1个或n个func,用逗号隔开
m.Get("/",func(){println(3)},func(){println(4)})
// 如果访问的是“/”,会再继续打印3和4在控制台上
到目前为止,还没有注入任何东西,所以只能用macaron.Context
m := macaron.Classic() 事实上用经典模式已经帮你注入了一些了。先当作没有注入来看
#开始注入
先注入一个Student的struct
// 这里是Student的定义,以后不再说了
type Student struct {
Id int
Name string
}func (s *Student) GetName() string {return s.Name
}func (s *Student) Job() {fmt.Println("study..")
}
注入的func,这里的注入,就相当于注册参数,使用Map的方法来注册参数
ctx.Map("arg2") //注册string类型的参数为arg2
ctx.Map(s) //注册Student类型的参数为s(也就是小明的那个实例)
// 关于注入,看http://my.oschina.net/u/943306/blog/500237
代码:
func MidStruct(opt string) macaron.Handler {var s *Studentif opt == "xm" {s = &Student{Id: 1, Name: "xiao ming"}} else {s = &Student{Id: 1, Name: "xiao wang"}}return func(ctx *macaron.Context) {ctx.Map(s) //关键语句,用于注入struct}
}
执行注入
m.Use(MidStruct("xm")) //执行注入动作
使用struct
// 如果之前注入过,那之后就可以取到被注入的struct了m.Get("/",func(){println(3)},func(){println(4)},func(s *Student){ //因为之前注入过了,所以这里直接用不会报错s.Job() //打印完上面的4后,会再打印一行study..})
这里的最后一个func,就相当于(http://my.oschina.net/u/943306/blog/500237#OSC_h1_9) 里的f2
#完整代码
package mainimport ("fmt""github.com/Unknwon/macaron"
)func main() {m := macaron.Classic()m.Use(MidStruct("xm"))m.Get("/", func(ctx *macaron.Context, s *Student) {fmt.Println(s.GetName())s.Job()})m.Run()
}func MidStruct(opt string) macaron.Handler {var s *Studentif opt == "xm" {s = &Student{Id: 1, Name: "xiao ming"}} else {s = &Student{Id: 1, Name: "xiao wang"}}return func(ctx *macaron.Context) {ctx.Map(s)}
}type Student struct {Id intName string
}func (s *Student) GetName() string {return s.Name
}func (s *Student) Job() {fmt.Println("study..")
}
转载于:https://my.oschina.net/u/943306/blog/506905
Macaron的注入struct相关推荐
- Linux I2C总线详解
概述: 1.I2C概念 2.I2C硬件结构图 3.I2C总线初始化 4.I2C控制器device 节点添加及driver注册 5.I2C设备节点添加及driver注册 5.adapter设备及驱动添加 ...
- 固件安全性—防止内存损坏和注入攻击
固件安全性-防止内存损坏和注入攻击 Firmware Security – Preventing memory corruption and injection attacks 构成物联网(IoT)主 ...
- ce变速注入dll失败_[LAB]一种无痕Dll模块注入方式
0x00 前言 方式:CreateRemoteThread 需要:visual studio 2015 需要:进程模块查看器,如[PCHunter][ProcessHacker]等. 需要:创建一个用 ...
- 一种在注入进程中使用WTL创建无焦点不在任务栏出现“吸附”窗口的方法和思路
最近一直在做沙箱项目,在项目快接近结尾的时候,我想给在我们沙箱中运行的程序界面打上一个标记--标识其在我们沙箱中运行的.我大致想法是:在被注入程序的顶层窗口上方显示一个"标题性"窗 ...
- VC下提前注入进程的一些方法3——修改程序入口点
前两节中介绍了通过远线程进行注入的方法.现在换一种方法--修改进程入口点.(转载请指明出处) 在PE文件中,其中有个字段标识程序入口点位置.我们通过这个字段,到达程序入口点.PE文件的结构我这儿不讨论 ...
- VC下提前注入进程的一些方法2——远线程带参数
在前一节中介绍了通过远线程不带参数的方式提前注入进程,现在介绍种远线程携带参数的方法.(转载请指明出处) 1.2 执行注入的进程需要传信息给被注入进程 因为同样采用的是远线程注入,所以大致的思路是一样 ...
- Swift中依赖注入的解耦策略
原文地址:Dependency Injection Strategies in Swift 简书地址:Swift中依赖注入的解耦策略 今天我们将深入研究Swift中的依赖注入,这是软件开发中最重要的技 ...
- 教你如何在C++二进制文件中注入git信息
这篇文章主要给大家介绍了关于怎么在C++二进制文件中注入git信息的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下 在后端生产环境中,为了方便定位问题,我们需要根据一个binary文件 ...
- 进程注入的研究与实现
为了对内存中的某个进程进行操作,并且获得该进程地址空间里的数据,或者修改进程的私有数据结构,必须将自己的代码放在目标进程的地址空间里运行,这时就避免不了使用进程注入方法了. 进程注入的方法分类如下: ...
最新文章
- 北大数学天才毕业后坚持出家:理想现实间的挣扎
- java openjdk 卸载_java – 如何卸载OpenJDK?
- 隐藏Nginx或Apache以及PHP的版本号的方法
- 定时清理日志文件-python实现
- Sub-Projects in Xcode(Xcode中的子项目)
- 安卓开发 登录用户信息缓存_在Linux上使用finger命令查询登录用户信息
- freemaker--hibernate
- 使用phonegap,进行页面跳转
- 导航猫连接Oracle
- 验证注册页面信息(JavaScript)
- 数字通信之抽样(二)
- App项目实战之路(一):概述篇
- 在线CAD平台,MxCAD云图 2021.01.20更新,在线CAD软件
- html中怎么做扇形菜单,纯CSS3实现扇形动画菜单(简化版)实例源码
- Count UVA - 1645
- HTML制作简单网页(京东新闻资讯页,歌曲推荐网页)
- 【P28】Enjoy The jFET 超简分立耳放
- 了解黑客常用的工具,我也能反黑了
- java上机实验作业 编写汽车类car_请问如何用Java编写一个汽车类Car
- VNCTF2023-misc方向wp