go常见问题

Beego是一个基于Go语言的高性能Web框架,支持快速开发RESTful API、Web应用及后端服务。本文详细介绍Beego的八大核心模块,MVC架构执行逻辑,路由设置,以及如何处理静态文件、模板和数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1、goland2017版本下载github.com/astaxie/beego之后无法使用,也没有在vendor目录。

通过go mod init / go mod vendor将第三方依赖库打包到vendor目录下面。

2、beego学习笔记

beego是一个快速开发go应用的HTTP框架,他可以用来快速开发API、Web及后端服务等各种应用,是一个RESTful的框架,设计灵感来源于tornado、sinatra和flask这三个框架,但是结合了Go本身的一些特性(interface、struct嵌入等)而设计的一个框架。

beego是基于八大独立的模块:cache、config、context、httplibs、logs、orm、session、toolbox构建的,是一个高度解耦的框架。

beego的执行逻辑

beego是一个典型的MVC架构,执行逻辑如下:

MVC的含义就是M(models目录)、V(views目录)和C(controllers目录)的结构,main.go是入口文件。

快速入门

 项目路由设置

   go的执行过程:main入口,首先执行子包,全局const  var 定义,init(),再回到main包的const var定义,init(),接着执行main();

 

package routers

import (
    "quickstart/controllers"
    "github.com/astaxie/beego"
)

func init() {
    beego.Router("/", &controllers.MainController{})
}

路由包里面我们看到了执行路由注册beego.Router,这个函数的功能映射URL到controller,第一个参数是URL,第二个参数是对应的Controller,也就是我们即将把请求分发到那个控制器来执行相应的逻辑。

beego.Run表面上好像只是监听服务端端口,但是它内部做了很多事情:

1、解析配置文件

自动解析在conf目录下面的配置文件app.conf

2、执行用户的hookfunc

3、是否开启session

4、是否编译模板

5、是否开启文档功能

6、是否启动管理模块功能

7、监听服务端口

controller逻辑

type MainController struct {

       beego.Controller

}

MainController自动拥有了所有beego.Controller的方法。beego.Controller拥有很多方法,其中包括Init、Prepare、Post、Get、Delete、Head等方法。可以重写其中的方法。

请求默认是执行对应req.Method的方法。例如浏览器的GET请求,那么默认就是执行MainController下的Get方法。这样我们上面的Get方法就会被执行到,这样就进入了我们的逻辑处理。

model分析

web应用用的最多的就是数据库操作,而model层一般用来做这些操作。逻辑里面存在着可以复用的东西,那么就抽取出来变成一个模快。因此Model就是逐步抽象的过程,一般我们会在Model里面处理一些数据读取。

View编写

在编写Controller的时候,在Get里面写过这样的语句this.TplName = "index.tpl",设置显示的模板文件,默认支持tpl和html的后缀名,如果想设置其他后缀你可以调用beego.AddTemplateExt接口设置,那么模板如何来显示相应的数据呢?beego采用了Go语言默认的模板引擎,所有和Go的模板语法一样。Go模板的详细使用方法请参考《Go Web编程》

在Controller里面把数据赋值给了Data(map类型),然后我们在模板中就直接通过key访问.Website和.Email。这样就做到了数据的输出。

静态文件处理

前面介绍了如何输出静态页面,但是我们的网页往往包含很多静态文件,如图片、JS、CSS,刚才创建的应用里面就有创建了如下目录/static/css  /static/img  /static/js

beego默认注册了static目录为静态处理的目录,注册样式:URL前缀和映射的目录

StaticDir["/static"] = "static"

用户可以设置多个静态文件处理目录,例如你有多个文件下载目录download1、download2,就可以这样映射(/main.go文件中beego.Run()之前加入):

beego.SetStaticPath("/down1", "download1")

beego.SetStaticPath("/down2", "download2")

这样用户访问URL http://localhost:8080/down1/123.txt则会请求download1目录下的123.txt文件

beego的MVC架构介绍

MVC执行逻辑流程1:

1、main文件监听端口8080

2、用户新链接

3、初始化context

4、执行过滤器(BeforeRouter)

5、静态文件处理

6、是否开启admin

7、是,监控统计URL

MVC执行流程2:

1、main文件监听端口8080

2、用户新链接

3、初始化context

4、执行过滤器(BeforeRouter)

5、执行过滤器(AfterStatic)

6、查找固定的路由

7、是否匹配,否,查找正则路由,否,查找自动化路由

8、执行Controller逻辑

9、执行过滤器(BeforeExec)

10、执行Controller的init函数

11、Enable XSRF 是,执行Controller的CheckXsrfCookie

12、否,执行Controller的prepare

13、执行Controller的逻辑函数(Get/Post等)

14、执行Controller的Render函数

15、执行Controller的Finish函数

16、执行过滤器AfterExec

17、执行Controller的Destructor函数

18、是否开启admin,是,监控统计URL

路由设置

前面介绍MVC执行时,beego存在三种方式的路由:固定路由、正则路由、自动路由

所有支持的基础函数如下所示:

  • beego.Get(router, beego.FilterFunc)
  • beego.Post(router, beego.FilterFunc)
  • beego.Put(router, beego.FilterFunc)
  • beego.Patch(router, beego.FilterFunc)
  • beego.Head(router, beego.FilterFunc)
  • beego.Options(router, beego.FilterFunc)
  • beego.Delete(router, beego.FilterFunc)
  • beego.Any(router, beego.FilterFunc)

RESTful Controller路由

固定路由

固定路由也就是全匹配的路由,如下:

beego.Router("/", &controllers.MainController{})
beego.Router("/admin", &admin.UserController{})
beego.Router("/admin/index", &admin.ArticleController{})
beego.Router("/admin/addpkg", &admin.AddController{})

上面是我们常用的路由方式,一个固定的路由,一个控制器,然后根据用户请求方法不同请求控制器中对应的方法,典型的RESTful方式

固定路由也就是全配置的路由,如下所示:

beego.Router("/", &controllers.MainController{})
beego.Router("/admin", &admin.UserController{})
beego.Router("/admin/index", &admin.ArticleController{})
beego.Router("/admin/addpkg", &admin.AddController{})

 上图是最常用的路由方式,一个固定的路由,一个控制器,然后根据用户请求方法不同请求控制器对应的方法,典型的RESTful

方式。

正则路由

beego参考了sinatra的路由实现,支持多种方式的路由:

  • beego.Router(“/api/?:id”, &controllers.RController{})

    默认匹配 //例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123”

  • beego.Router(“/api/:id”, &controllers.RController{})

    默认匹配 //例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123”,但URL”/api/“匹配失败

  • beego.Router(“/api/:id([0-9]+)“, &controllers.RController{})

    自定义正则匹配 //例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123”

  • beego.Router(“/user/:username([\\w]+)“, &controllers.RController{})

    正则字符串匹配 //例如对于URL”/user/astaxie”可以匹配成功,此时变量”:username”值为”astaxie”

可以在Controller中通过如下方式获取上面的变量

this.Ctx.Input.Param(":id")
this.Ctx.Input.Param(":username")
this.Ctx.Input.Param(":splat")
this.Ctx.Input.Param(":path")
this.Ctx.Input.Param(":ext")

自定义方法及RESTful规则

上面列举的是默认的请求方法名(请求的method和函数名一致,例如GET请求执行Get函数,POST函数执行Post函数),如果用户期望自定义韩树明,那么可以使用如下方式:

beego.Router("/",&IndexController{},"*:Index")

使用第三个参数,第三个参数就是用来设置对应method到函数名,定义如下:

*表示任意的method都执行该函数

使用httpmethod:funcname格式来展示

多个不同的格式使用;分割

多个method对应同一个funcname,method之间通过,来分割

以下是多个http Method指向同一个函数的示例:

beego.Router("/api",&RestController{},"get,post:ApiFunc")

以下是不同的method对应不同的函数,通过;进行分割的示例:

beego.Router("/simple",&SimpleController{},"get:GetFunc;post:PostFunc")

可用的HTTP Method

*:包含以下所有的函数

get:GET post:POST put:PUT delete:DELETE patch PATCH options:OPTIONS head:HEAD

同时存在*和对应的HTTP Method,那么优先执行HTTP Method的方法。

自动匹配

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值