Java看累了?玩会儿Go吧!
It‘s Go!
Go的吉祥物:

是不是很沙雕[#233],有趣的灵魂,爱了爱了。en,Go大概是2010年的新兴语言,和其他老前辈们比还是个小孩子。
Why Go?
Go语言Golang,与c一样是一种静态强类型语言,和java一样有垃圾回收机制Gc,支持低消耗的并发,与Docker亲和力极高(因为Docker是Go写的嘛),Go的web程序能在Docker中占用极小的内存。
这些都是听别人说的,在逐渐深入的学习中,慢慢总结吧。
Let’s Go!
从helloworld开始? No!! Go的底层原理复杂,但是语法易懂。我们不必从abc开始学习,从开源项目入手,慢慢的去熟悉它,看不懂的地方再去查阅资料。既然学了这么长时间的JavaWeb,我们来看一下Go的Web是什么样的流程呢?
项目结构
这是一个Go的Web开源项目,使用了Gin这个框架,是MVC模式,结构如图所示:

它的入口是main.go,这使我们联想到了springBoot,我们只需要在命令行输入go run main.go便可运行这个项目,它会运行在一个端口上。
- 使用
PostMan向它的一个接口发送Post方式的请求,会发生什么事呢?

Server
- 首先进入了
server包下的router.go
1 | // 路由 |
显然,它设置了一个类似于requestMapping的路径,然后指定了这个路径调用的”方法“。
Api
- 然后,它根据请求路径,调用了
api包下的AddVideo
1 | //所在的包 |
注意,这个注释是我加的,只是一个不懂Go的java使用者的胡猜,并不准确。
然后可以看到,它又调用了一个和service有关的方法,所以我们想,这个api对应Controller,而且前面也说了是MVC模式,所以Service应该也能明白。
1 | c.JSON(200, result) |
Controller在返回数据时,使用了c的方法,这个方法应该是返回了Json,而这个c应该是github.com/gin-gonic/gin包下的,Gin是Web框架,所以这个c可能是框架封装好的。
Service
- 接下来,我们看Controller调用的service里是什么
1 | package service |
代码想想应该能明白。
1 | model.DB.Create(&video) |
这个方法操作了数据库,这个应该是框架的封装。不过我找到了配置数据库的这段代码:
1 | package model |
Model
- 再次检查Service
应该都看到了这一块代码:
1 | video := model.Video{ |
这里对Video模型和service的Video的参数进行了绑定,Video模型Model代码如下:
1 | package model |
Serializer
- 最后一个封装,我们在看一遍Service的代码
1 | //操作数据库,把错误返回 |
我们看一下serializer.Response做了什么:
1 | package serializer |
显然,这是对服务器返回结果的通用序列化封装。
- 还有一个专门对Video结果序列化的封装
1 | return serializer.Response{ |
serializer.BuildVideo():
1 | package serializer |
返回结果

code和msg好像不大对,不过我们成功的向数据库中插入了一条数据,也算是走通了吧。

努力更新中…
基本增删改查
第二天睡醒

??肥皂君?
好吧,顺便再把其他几个简单接口看了。
增
- 这个接口我们已经看过了
1 | POST http://localhost:3000/api/video/createVideo |
- 请求
1 | { |
- 响应
1 | { |
为什么不截图?e,图床宕机了,emmm
查One
1 | GET http://localhost:3000/api/video/showVideo/1 |
响应
1 | { |
- server
1 | //展示一个视频的详情/:id |
- api
注意id由c.Param("id")传入service的函数
1 | //ShowVideo 展示视频的详情 |
- service
注意这里ShowVideoService的结构体为空,model.DB.Find(&video, id)是根据id查询video表
1 | package service |
查List
1 | GET http://localhost:3000/api/video/listVideos |
响应
1 | { |
- server
1 | //展示所有视频的列表 |
- api
注意Get请求是无需ShouldBind的
1 | //ListVideos 展示所有视频的列表 |
- service
model.DB.Find(&videos)查询videos表中全部数据,特别要注意这里对Videos的序列化处理,看serializer部分
1 | package service |
- serializer
BuildVideos进行了一个for循环,将输入的Video数组,输出成序列化的Json
1 | package serializer |
删
1 | DELETE localhost:3000/api/video/deleteVideo/7 |
响应
1 | { |
- server
1 | //删除一个视频 |
- api
注意这里不用shoudbind,否则必须携带json数据
1 | //DeleteVideo 删除一个视频 |
- service
先查询,然后直接将查询到的数据作为参数,执行删除
1 | package service |
改
1 | PUT http://localhost:3000/api/video/updateVideo/4 |
请求
1 | { |
响应
1 | { |
- server
1 | //更改一个视频 |
- api
注意,这里既使用了ShouldBind绑定,又使用c.Param("id")向service.Update()传递了id的值
1 | //UpdateVideo 更新一个视频 |
- service
首先是结构体,先使用传递过来的id查询了要修改的video信息,然后把service在ShouldBind获得的信息,传给了video,最后保存video
1 | package service |
是不是觉得这些代码太过简单?当然,因为其实是我写的,233。