回忆一下使用Gin的时候,路由是这样构建的


其中的controller是负责请求的处理,如果是post请求会有ShouldBindJSON这样的方法把body里面的json转换为业务需要的对象


ShouldBindJSON的功能就是把c.Body转换为想要的对象。在Spring或者类似的框架里面,使用了参数注解来优雅的完成。而Go就直接在Context里面实现。实现如下

可以看到这段代码了几个小细节,errors包的使用。如果是C# java这里是抛出异常。

json.NewDecoder() 声明是这样子的,可以直接传入c.Body

decoder.DisallowUnknownFields()比较有意思,涉及此方法返回的error

下面是跟这个方法相关的测试代码,它的作用是如果json中的字段在struct中不存在就报错,因此这段代码会输出 unknown field "color" 错误

从需求上理解其实个人觉得并不需要使用DisallowUnknownFields,毕竟业务只关注自己想要的字段。

而Go的一个相对方便的单元测试功能就是类似 Test_Json(t *testing.T) 这样声明的方法。

decoder.Decode(&stu) 这种写法让人想起大学时候练习C、C++,传的是指针,而不是复制值到方法里面。

记得C#里面也有相关的关键字ref。

至于bytes.NewBufferString() 日后都可以用来模拟需要io.Reader的情况。

接下来,可以想象模仿Gin里面的路由写法。