上个文章是讲 macron 使用基础库的基本内容,文章地址如下:
Go macaron (马卡龙) 库 (一):(https://testerhome.com/topics/25088)
下面来讲下 ctx 多个处理器之间传递对象和结构体使用,返回 JSON 和介绍下 Go 的一些语法。
import (
"encoding/json"
"gopkg.in/macaron.v1"
"log"
"net/http"
)
//回包结构体
type JsonResult struct{
Code int `json:"code"`
Data interface{} `json:"data"`
Msg string `json:"msg"`
}
func main() {
var result JsonResult
mr.Get("/echo", func(ctx *macaron.Context) {
ctx.Data["id"] = 1
}, func(ctx *macaron.Context) {
ctx.Data["id"] = ctx.Data["id"].(int) + 1
}, func(ctx *macaron.Context) {
ctx.Data["id"] = ctx.Data["id"].(int) + 1
}, func(ctx *macaron.Context) ([]byte, error) { //返回Json类型
result.Code =200
result.Data = ctx.Data["id"]
result.Msg = "获取上下文结果成功"
//Json序列化数据result
msg, err := json.Marshal(result)
return msg,err
}, )
log.Println("Server is running")
log.Println(http.ListenAndServe("127.0.0.1:4000", mr)) //go语言标准库基础来启动实例
这里写一个简单的 get 请求,path 段为/echo。
func 区域使用匿名函数,处理器第一层给上下文对象里面赋予一个 id,值=1,源码可见 Context 这个上下文对象的 Data 对象是一个 Map,key 需要是一个字符串,Value 可以是任何类型,这里用 int 1.
type Context struct {
Data map[string]interface{}
}
处理器是线性往下执行的,处理器第二层和第一层之间需要是,说明这里面后面还有代码。ctx.Data["id"] 对象等于右边执行赋予左边,原来数上面 +1.
func(ctx *macaron.Context) {
ctx.Data["id"] = ctx.Data["id"].(int) + 1
}
第三层里面和第二层一样的,是为了验证处理器一样的还是会执行依次,原来数上面 +1 ,1+1+1 =3
第四层会返回一个 JSON 类型
//返回2个数据,字符数组和error
func(ctx *macaron.Context) ([]byte, error) {
result.Code =200
result.Data = ctx.Data["id"] //这个Data需要是interface{}类型 和ctx.Data对象,类似Java泛型和Object。
result.Msg = "获取上下文结果成功"
//序列化数据
msg, err := json.Marshal(result)
return msg,err
}, )
其中 var result JsonResult 的 JsonResult 是这样的。Data 和 ctx.Data 对象一致。
type JsonResult struct{
Code int `json:"code"`
Data interface{} `json:"data"`
Msg string `json:"msg"`
}
在浏览器上输入http://127.0.0.1:4000/echo 结果如下。