Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用Golang+Mongodb打造你的第一个站点大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。


很多人推荐MEAN来开发站点。MEAN就是M:mongodb,E:expressjs、A:angular最后的N:nodejs。 但是如果你亲身的体会到了js的嵌套回调的话你就会想换换别的办法了。然说可以用promise等框架 破解深深的嵌套,但毕竟不是语言本身支持的。

为什么说用Golang呢?因为Golang是一个有着动态语言的特点的静态语言。语法简单,语法糖就是尽量减少语法。 编译的时候就可以把错误排查掉很多。不用像动态语言那样运行的时候才掉进坑里。

在Golang众多的Web框架中发现了Martini。 他后来觉得这个框架用了太多反射影响了效率,就有写了另一个框架或者按照作者的说法“中间件”, 叫做Negroni。具体的开发原因看这里。 可能是这个作者爱喝酒把他写的框架都叫了个酒水的名字。Margini这个框架是作者受了Expressjs的启发写出来的。 所以在很多使用上的东西非常类似,比如route的绑定语法,支持类中间件的绑定语法等。也看过Golang的其他框架比如revel, 有很多的酷炫的功能,和一站式的很多的支持,但是因为MarTini的灵活决定选用Margini。

@L_251_13@mongoDB

数据库方面,对于事物和数据的一致性要求没有那么强的话,还是选用比较简单的Nosql数据库比较合适。所以,就用MongoDB了。 也许在严谨的工作中不应该这么用。但是MongoDB可以简单到,只要把http POST过来的json数据直接写入数据库中。 如果json比较简单的话,完全不用做什么设计!当然,实际工作的时候是不可以这样的。我们讨论的只是这样的一个可行性。

那么我们就开始用MarTini(golang)和MongoDB来打造一个web APP。这个app的名称就叫做navigator(领航者)。 是用来接受、存储和分析用户反馈以及用户的各种问题的,比如各种客户反馈回来的用户问题。这些问题的上下文信息十分有限。 所以我们让用户通过手机客户端来调用navigator的接口来同时提交相关的上下文信息。 关于Golang的一些基础的东西就不在这里探讨了。 go get@L_902_27@marTini,下载MongoDB。之后使用命令run起来MongoDB。给DB起一个名字:NDB。然后在里面填充一个document。 MongoDB如果没有insert一个Document的话,那么这个数据库其实是没有创建的。这个Document就是一个Json。格式为:

 
 
{ "FeedBACkcode" : "123" , "username" "" "phonenum" "deviceinfo" "systemtype" "systemver" "appver" "" } "imagelist" [ ] "desc" "tesTing" "FeedBACktype" "other" "" }

使用FeedBACkCode来标示一个唯一的FeedBACk。数据库的问题就彻底解决了。

站点的目录结构

下面开始我们的站点部分。首先了解一下目录结构:

 
 
navigator |———conf |-————–Conf.go # 配置信息 |—————–ConfigError.go # 错误名称 |———controllers |—————–FeedBACkController.go |—————–IndexController.go |–––models |––––––FeedBACkmodel.go server.go

这个目录结构式典型的REST API的MVC模式体现。我们这里不需要处理View,也就是Html的东西。但是, 还是显示的区分了Model和Controller。view其实还是有的,只不过是最后render后的json。

RUN起来

首先,让我们的web app跑起来。 给server.go添加如下的代码

 
 
package @H_635_139@main import "github.com/go-marTini/marTini" func @H_183_19@main ( ) @H_271_157@m := @H_183_19@marTini . Classic ) @H_183_19@m Get ( "/" :rgb(0, func String return "Hello World!" } Run ) go run server.go命令就可以让这个web app运行起来了。认的是运行在3000端口上的。 在页面上也只能看到光秃秃的几个字Hello World!@H_823_203@marTini.Classic()调用之后,MarTini会为你认提供一些工具。其中最重要的一个就是路由在这之后就可以使用@H_823_203@m.Get("/",func()String{return "Hello,world!"}来指定什么路径映射到什么处理方法上。 最后调用@H_823_203@m.Run()方法在3000端口上运行整个app。

现在开始要真正的开发这个app了。首先我们需要有一个简单的需求分析,我们到底是要做什么。 如前所述,用户可以用这个API发送FeedBACk上来,然后在另外一个接口里把这些内容以列表的形式展示出来。 需求就是这么简单。我们下面来一步一步实现这些功能

Controllers

由于insert一个FeedBACk,需要的信息量还是很大的。我们用POST得方法发送所需要的FeedBACk数据。 所以,我们需要一个POST的路径和处理函数Handler(以后都叫做Handler)。

 
 
Post ( req * http request String // 从req中取出参数,插入到数据库 )

现实FeedBACk的列表的接口只需要响应一个GET请求。所以是一个GET的路径和Handler。 看起来应该是这样的

 
// 假设最后的字典会被转换成Json串 [ ] @H_999_263@map [ String ] { { "FeedBACkcode" "1" "username" "John" } "2" "Tony" } } 以上列出的Handler都是对于API添加数据和数据列表的一些模拟。下面开始开始正式写Controller。

列表Controller

先看代码,然后再来详细说明:

controllers
( // "fmt" "fmt" "github.com/marTini-contrib/render" "navigator/conf" "navigator/models" "net/http" ) type FeedBACkController struct { } c FeedBACkController FeedBACkList request r render Render { f new @H_376_151@models FeedBACkmodel r JSON ( 200 ] interface { { "data" f @H_567_161@modelList ( @H_334_404@nil ) 引入github.com/marTini-contrib/render,render一个渲染的包。 如果有html的视图的话,可以把数据转换成html模板可用的数据。我们这里用这个包来把字典转换成json数据。r.JSON(200,map[String]interface{}{"data": f.ModelList(nil)})中200,是状态码。 需要转换的字典是一个String为key,Model列表为值的字典。

这里可以先了解一部分FeedBACk的Model类:

 
 
DeviceInfo SystemType ` json "systemType" ` // ios or android SystemVer "systemVersion" ` // system version eg,ios 9.1 AppVer "appVersion" ` // app version eg,2.9.0 } FeedBACkmodel FeedBACkCode "FeedBACkCode" ` UserName "userName" @H_183_19@phoneNum "phoneNum" "deviceInfo" ImageList "imageList" Desc "description" FeedBACkType "FeedBACkType" ` // normal FeedBACk or a problem in use Other "other" ` // other infomation 在最开始的json数据定义,在Golang的Model类定义中可以定义为上面的代码。 用"``"标示出来的,是在Model转换为json字符串的过程中Model字段和json串的key值得对应关系。 最后Controller的功能是需要处理请求过来的数据的, 也就是Controller的方法会作为Get或者Post的Handler的。这两者之间需要关联起来:

@H_371_252@main

// other packages "navigator/controllers" ) var = NewRouter ) FeedBACkController controllers ( "/nav/FeedBACk" FeedBACkController FeedBACk Action Handle RunOnAddr ( ":9090" 这里r.Get("/nav/FeedBACk",FeedBACkController.FeedBACkList)修改了之前的访问路径。/nav/FeedBACk是在路径上加了一个项目的名称简写作为限定。因为直接叫做FeedBACk有可能会和其他的同名接口混了。 也就是接口的污染。所以加一个项目名称来避免这个问题。FeedBACkController := new(controllers.FeedBACkController)初始化FeedBACkController。 把FeedBACkController方法FeedBACkList和访问的路径绑定到一起。GEThttp访问和FeedBACkList方法绑定,POSThttp访问和FeedBACk方法绑定。 最后@H_823_203@m.RunOnAddr(":9090")代替了之前使用的@H_823_203@m.Run()。之前app是运行在3000端口上的。 现在通过@H_823_203@m.RunOnAddr(":9090")则app将运行在9090端口上。也就是可以用这一语句来制定app的运行端口。

Models和MongoDB

处理MongoDB我们用mgo这个库。Golang然这么多年了已经。还出了这么多的明星产品。 但是,处理MongoDB的成熟的库还是可以说没有。完全没有想python、nodejs等语言的库那么丰富。 有标准的,还有很多github上的其他开发者开发的库。Golang里也就是mgo相对来说这个库比较可用的了。

当POST请求的FeedBACk的json字符串传上来的时候,会被转换为一个FeedBACkmodel的对象。 Golang的json库会帮助我们做到这一点。json.Unmarshal([]byte(Dict),&f)这里的Unmarshal方法会把一个json字符串转化为FeedBACkmodel对象。 这里需要用一个工厂方法生成@L_112_3@model对象,并且这个对象应该是一个富Model对象。 后面这个Model对象将具有可以操作操作数据库,增、删、改、查的方法代码

 
 
NewFeedBACkmodel Dict String FeedBACkmodel err Unmarshal ( ] byte Dict ) & f if != @H_334_404@nil
nil } f 以上代码会用到库"encoding/json"。当收到FeedBACk的json串的时候就用这个方法将其转换为FeedBACkmodel对象。 上文说过,会给这个Model增加数据库操作的方法。那么我们就可以通过json串得到的Model来执行数据的操作。 代码

conditions
] confInstance conf ConfigInstance @H_376_151@mgoUri @H_183_19@mongoDBConnectionString // var f FeedBACkmodel session @H_567_161@mgo Dial @H_376_151@mgoUri fmt Printf ( "can not connect to server %v \n " err panic } defer Close FeedBACkmodelList FeedBACkmodel collection DB confInstance DBName C ( "FeedBACk" collection Find conditions All ( FeedBACkmodelList FeedBACkmodelList GetModel @H_376_151@modelId FeedBACkmodel error //此处省略一部分代码 bson @H_567_161@m @H_271_157@modelId One nil InsertModel @H_376_151@model error Insert @H_376_151@model err 这里需要稍微的提到一部分MongoDB的知识。在MongoDB中,库还是库,但是表不叫做表,叫做Collection。 关键字不翻译。翻译出来的看着太烂,还不能清楚表达意思。每一条记录也不叫记录,叫做Document。 一个Document的大小不能超过2M。

在MongoDB里查找是这样的

 
 
db . FeedBACk find ( { "FeedBACkCode" "1" } @H_801_803@//查找条件就是{"FeedBACkCode":"1"}) //查找条件就是

如果在find里什么都不写,那么就是无条件的全部查找。插入是这样的

insert
"2" Golang的@H_869_209@mgo当然在具体操作数据库方面和MongoDB本身是不会差太多了,除了这是Go语法的封装。

 这样就得到了一个Collection。查找、插入、修改等动作都是在Collection上执行的。所以,查找就是这样的

 查找到的列表会存放在一个事先声明好的FeedBACk的Model列表里。查找一个可以这样:

 插入:

 insert的时候,这个model需要是指针类型的,也就是:var model *FeedBACkmodel

到这里就可以把整个FeedBACk从请求到返回的过程都串联起来了。

全部串联起来

在整个的app入口处。请求的路径和具体的Controller处理函数绑定在了一起。每一个请求来了之后 ,如果路径和绑定的路径是对应好了的。就会被发送给Controller的某个绑定好的函数里处理。

这个负责处理http请求的Controller方法会把http请求发送上来的json字符串发送给Model模块处理。 Model模块会把json字符串转换为@L_112_3@model实例。这个Model是一个富Model, 可以调用函数把Model本身的数据插入到Mongo数据库中,当然也可以从数据库查询这些数据。

到这里

到这里你已经熟悉了如何用MarTini这个Golang框架开发一个简单地站点,好吧,其实是一个REST Api。 使用我们文中提到的Render框架,你可以非常非常容易的把Model数据转换之后并显示在html的template中。 而且你已经熟悉了MongoDB数据库一个非常简单易用数据库。无论你是要开发一个REST Api还是要开发一个html的站点。 需要存储的东西都可以存如MongoDB数据库中。到这里你已经可以顺利的继续下面的功能的开发了。

本图文内容来源于网友网络收集整理提供,作为学习参使用,版权属于原作者。
@H_91_874@
@H_91_874@

猜你在找的Go相关文章

方法和接收者 Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者 self。 Go 语言中同时
函数是组织好的、可重复使用的、用于执行指定任务的代码块。 Go语言中支持函数、匿名函数和闭包,并且函数在Go语言中属于“一等公民”。 函数定义 Go语言中定义函数使用func关键字,具体格式如下: f
面向对象的三大特征: 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式 继承:使得子类具有父类的属性和方法或者重新定义、追加属性和方法等 多态:不同对象中同种行为的不同实现方式 Go并不是一个纯
在工程化的开发项目中,Go语言的源码复用是建立在包(package)基础之上的。 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言提供了很多内置包,如fmt、os、io等。
为什么要学 Go 性能优越感;Go 极其地快,其性能与 Java 或 C++相似。在使用中,Go 一般比 Python 要快 30 倍; 序列化/去序列化、排序和聚合中表现优异; 开发者效率较高;多种
什么是反射 官方关于反射定义: Reflection in compuTing is the ability of a program to examine its own structure, pa
@L_616_213@
因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性。 func arraySum(x [3]int) int{ sum := 0 for _, v := range x{ su
接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类型。 interface是
@H_91_874@
@H_91_874@
@H_91_874@

使用Golang+Mongodb打造你的第一个站点

微信公众号搜 "程序精选"关注
@H_91_874@
@H_91_874@
@H_91_874@

大佬总结

以上是大佬教程为你收集整理的使用Golang+Mongodb打造你的第一个站点全部内容,希望文章能够帮你解决使用Golang+Mongodb打造你的第一个站点所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:golangmongodb使用打造站点第一个
猜你在找的Go相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap