学习go语言也有一段时间了,正好手头自己家公司的官网,算一个无关紧要的小项目,就用go语言来练练手,实战一个。
在框架上选择了成熟的beego项目。
Beego提供了完整的MVC解决方案和项目构建工具,通过bee命令可以简单地创建、编译、执行、发布一个WEB或者API项目。官方的文档相当完整详尽而且全是中文,真是好得不要不要的。
###创建项目
第一步当然是创建一个新项目。此处基本是按照文档的走。
首先安装beego
go get github.com/astaxie/beego
复制代码
beego的安装路径是在GOPATH/bin目录中。官方建议将此目录添加到path,其实不添加也一样可以用。
项目目标路径位于GOPATH/src/xohome,新建项目的命令如下:
src$ ../bin/bee new xohome
复制代码
然后会自动在src/xohome下生成响应的项目结构,具体结构请参照文档,在此不细说了。
至此项目就已经可以执行了,在xohome下执行命令
../../bin/bee run
复制代码
然后访问默认的8080端口,就可以看到beego的logo了。
###Controller与模板
在新建好的项目中,已经有了默认的controller,位于controller目录下的default.go文件。还有默认的router.go文件。
type MainController struct {
beego.Controller
}
func (c *MainController) Get() {
c.Data["Website"] = "beego.me"
c.Data["Email"] = "astaxie@gmail.com"
c.TplName = "index.tpl"
}
复制代码
default.go文件的默认内容如上。beego基于go语言自带的模板对页面进行渲染。在默认创建的目录结构中,模板文件位于views目录下,而静态资源则位于static目录下。若要访问静态资源,直接访问/static/...即可。
很多时候都是通过对controller结构体进行赋值来进行操作。这一点上与java的基于方法进行操作有较大的不同。当然也有很多常见的方法。比如下面这个用来提交表单的controller:
type SubmitController struct {
beego.Controller
}
func (c *SubmitController) Get(){
c.TplName = "start.tpl"
}
type ResultJson struct {
State int
Message string
}
func (c *SubmitController) Post(){
var project = models.Projects{};
project.Money = c.GetString("money","")
project.About = c.GetString("about","")
project.Time = c.GetString("time","")
project.Contact = c.GetString("contact","")
project.Name = c.GetString("name","")
project.Type,_ = c.GetInt("type",0)
o := orm.NewOrm()
o.Using("xohome")
_,e := o.Insert(&project)
if(e == nil){
res := ResultJson{State:0,Message:"success"}
c.Data["json"] = res
c.ServeJSON()
return
}else{
res := ResultJson{State:1,Message:"处理发生错误"}
c.Data["json"] = res
fmt.Print(e.Error())
c.ServeJSON()
return
}
}
复制代码
代码很简单,走Get方法的时候返回个页面,走Post方法的时候保存至数据库并返回一个json。
controller需要在router中进行注册,默认案例如下:
func init() {
beego.Router("/", &controllers.MainController{})
beego.Router("/start", &controllers.SubmitController{})
}
复制代码
在init()方法中进行注册,在默认的main.go文件中,有如下引用:
_ "xohome/routers"
复制代码
来执行此方法。
###数据库操作
有眼尖的朋友已经见到上一部分中的数据库操作。这是beego提供的orm模块。
这个orm模块用起来也是很简单,首先需要引入一个数据库驱动,比如mysql的驱动:
_ "github.com/go-sql-driver/mysql"
复制代码
然后找个地方初始化一下orm的配置:
func init() {
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "username:password@tcp(mysql.com:3449)/xohome?charset=utf8")
}
复制代码
我将这两行代码放在了main.go文件中,其实只要能够保证一开始就执行,放在哪都差不多。
然后的操作代码就如上一段所示
o := orm.NewOrm()
o.Using("default")
_,e := o.Insert(&project)
复制代码
是不是特别的简单呢?插入的表就是project结构体的名称。beego还支持一对多,多对多等映射,自定义表名,事务控制等高端功能,可以去查看官方文档进一步学习。
###项目部署
beego提供了打包的工具,只要执行命令如下:
GOOS=linux ../../bin/bee pack
复制代码
看过我之前的文章应当知道,GOOS是go语言跨平台编译的参数,指定为linux就可以打包成linux下可用的tar.gz文件。然后直接上传上去解压执行即可。继承了go语言部署简单的传统。
###结束语
恩,没有了。
本来就是一个非常简单,只有两个页面的展示性首页。但是充分展示了go语言开发web应用的潜力。go完整的工具链,简洁的api风格,方便的部署方式相信也有所体会。
接下来还要继续去研究我的文件服务,这个东西就到此为止了。