每学一门编程语言,都离不开学习它的语言特征:
1.支持哪些 基本数据类型,如整数,浮点数,布尔值,字符串,支持哪些高级数据类型,如数组,结构体等。
go数据类型基本有整数,浮点数,字符串,布尔值,数组,切片(slice) 和 字典(map) 。
布尔值:bool。
整数:int (默认类型,一般视操作系统位数=int32或int64),int32,int64。
浮点数:float32,float64(默认类型,更大的精度)
字符:string。
数组,切片(可变长数组),字典(键值对结构)。

2.if 判断和 while 循环语句是怎样的,是否有 switch 或者 goto 等语句。
3.语言 函数 的定义是怎样的,如何传递函数参数,有没有 面向对象 的语言特征等。
4.package 包管理是怎样的,如何管理一个工程,官方提供哪些标准库,如时间处理,字符串处理,HTTP 库,加密库等。
5.有没有特殊的语言特征,其他语言没有的,比如某些语法糖。

go开发环境路径
goroot 就是go的安装路径
gopath 就是工作目录,包含src、pkg、bin文件夹
注意:不要把gopath设置成安装目录
win下路径除了goroot需要手动设置,另外的gopath和path安装包会自动设置

bee命令

bee new
new 命令是新建一个 Web 项目,我们在命令行下执行 bee new <项目名> 就可以创建一个新的项目。但是注意该命令必须在 $GOPATH/src 下执行

bee api
上面的 new 命令是用来新建 Web 项目,不过很多用户使用 beego 来开发 API 应用。所以这个 api 命令就是用来创建 API 应用的

bee run
我们在开发 Go 项目的时候最大的问题是经常需要自己手动去编译再运行,bee run 命令是监控 beego 的项目,通过 fsnotify (opens new window)监控文件系统。但是注意该命令必须在 $GOPATH/src/appname 下执行。

bee pack
pack 目录用来发布应用的时候打包,会把项目打包成 zip 包,这样我们部署的时候直接把打包之后的项目上传,解压就可以部署了.注意:bee pack -be GOOS=liunx

解决controllers\default.go:4:2: missing go.sum entry for module providing package
使用go mod tidy 来整理依赖,或者:go build -mod=mod

beego路由定义
有两种方式:

  1. 在router.php中配置

    beego.Router("/hello", &controllers.MainController{}, "get:GetHello")
  2. 在router.php中include引入,直接在函数上方配置规则

    beego.Include(&controllers.DemoController{})
    // @router /demo/hello [get]
    func (this *DemoController) GetHello() {
        var (
            title string
        )
        title = "Hello World!"
        this.Ctx.WriteString(title)
    }

MVC模式

在目录下有 controllers models views 文件夹分别存放controller文件,model文件和模板文件。后面项目中用到的文件都会分别在这三个文件夹中

过滤器和配置信息

过滤器,为什么有过滤器呢?

比如,进行安全验证,访问用户中心的时候,进行是否登录的判断可以在过滤器中,也可以实现屏蔽IP的功能,屏蔽黑名单的功能等等,对项目有整体的规则时,都可以在过滤器中实现,不用在每个函数中来实现了

过滤器是通过beego.insertfilter函数来实现的

在router文件中

    beego.InsertFilter("/demo/*", beego.BeforeRouter, FilterDemo)

    var FilterDemo = func(ctx *context.Context) {
        var (
            title string
        )
        title = "禁止访问"
        ctx.WriteString(title)
    }

这里是屏蔽规则,包含demo/的url都走过滤规则;第二个参数是BeforeRouter,在寻找路由之前;第三个参数是函数名。

配置信息

beego提供了专门配置文件,配置信息定义在conf文件夹中的app.conf

    appname = fyouku //项目名称
    httpport = 8098  //访问端口号
    runmode = dev    //运行环境,下面会根据运行环境加载不同配置

    [dev]
    apiurl = http://127.0.0.1:8099
    microApi = http://127.0.0.1:8085

    [prod]
    apiurl = http://127.0.0.1:8099
    microApi = http://127.0.0.1:8085

静态文件

项目中的css、js、img文件都是怎样访问的,bee new创建的项目中有static文件夹,这是beego默认注册的静态文件处理目录

├── static
    │   ├── css
    │   ├── img
    │   └── js

访问地址为:http://127.0.0.1:8080/static/js/fyouku.js

也可以通过下面命令来自定义目录

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

view语法

  1. 统一使用 {{ 和 }} 作为左右标签
  2. 使用 . 来访问当前位置的上下文
  3. 使用 $ 来引用当前模板根级的上下文
  4. 使用 $var 来访问创建的变量

判断语句 if ... else ... end

{{if eq .IsEmail 1}}
    <a class="email" href="mailto:{{.Email}}">{{.Email}}</a>
{{else}}
    <a class="email" href="#">不允许访问Email</a>
{{end}}

eq / ne / lt / le / gt / ge

eq: arg1 == arg2

ne: arg1 != arg2

lt: arg1 < arg2

le: arg1 <= arg2

gt: arg1 > arg2

ge: arg1 >= arg2

循环语句 range

{{range $index,$value := .Pages}}
    {{$index}} - {{$value.Num}} of {{$.Website}}
    <br>
{{end}}

载入其它模板

{{template "head.html" .}}

ORM使用

什么是orm?

在关系型数据库和对象之间作一个映射,在操作数据库时,不需要写复杂的SQL语句,只需要像操作对象一样。

第一步 安装

go get github.com/astaxie/beego/orm
go get github.com/go-sql-driver/mysql

第二步 配置数据库信息,加载信息

app.conf中增加配置信息

[dev]
defaultdb = root:123456@tcp(127.0.0.1:3306)/fyouku?charset=utf8

main.go中加载信息

    import (
    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    //获取配置文件中信息
    defaultdb := beego.AppConfig.String("defaultdb")
    orm.RegisterDriver("mysql", orm.DRMySQL)
    orm.RegisterDataBase("default", "mysql", defaultdb, 30, 30)

    beego.Run()
}

注意:ORM 必须注册一个别名为 default 的数据库,作为默认使用

第三步 model中使用

    package models

    import (
        "github.com/astaxie/beego/orm"
    )
    //定义type
    type Advert struct {
        Id       int
        Title    string
        SubTitle string
        AddTime  int64
        Img      string
        Url      string
    }

    func init() {
        //注册model
        orm.RegisterModel(new(Advert))
    }

    func GetChannelAdvert(channelId int) (int64, []Advert, error) {
        //使用前先new一下
        o := orm.NewOrm()
        var adverts []Advert
        num, err := o.Raw("SELECT id, title, sub_title,img,add_time,url FROM advert WHERE status=1 AND channel_id=? ORDER BY sort DESC LIMIT 1", channelId).QueryRows(&adverts)
        return num, adverts, err
    }

CRUD和原生SQL操作

这里对代码做了一些注释,和视频配合学习效果更佳。

package models

import (
    //引入orm
    "github.com/astaxie/beego/orm"
)

//操作数据库都需要定义struct和表结构对应
type User struct {
    Id      int
    Name    string
    AddTime int64
    Status  int
    Mobile  string
    Avatar  string
}

//初始化注册对应model
func init() {
    orm.RegisterModel(new(User))
}

//获取用户信息
func UserInfo(id int) (User, error) {
    //通过orm中的Read函数获取
    var (
        err error
    )
    o := orm.NewOrm()
    user := User{Id: id}
    err = o.Read(&user)
    return user, err
}

//保存用户
func Save(name string, mobile string, avatar string) error {
    //通过orm中的Insert来保存
    var (
        err  error
        user User
    )
    o := orm.NewOrm()
    //设置字段的值
    user.Name = name
    user.Mobile = mobile
    user.Avatar = avatar
    user.Status = 0
    _, err = o.Insert(&user)
    return err
}

//更新用户名
func UpdateUsername(id int, name string) error {
    //通过orm中的Update来保存
    var (
        user User
        err  error
    )
    o := orm.NewOrm()
    //先判断数据是否存在
    user = User{Id: id}
    if o.Read(&user) == nil {
        //存在更新姓名
        user.Name = name
        _, err = o.Update(&user)
    }
    return err
}

//删除用户,通过ID删除数据
func Delete(id int) error {
    //通过orm中的Delete来保存
    var (
        user User
        err  error
    )
    o := orm.NewOrm()
    user = User{Id: id}
    _, err = o.Delete(&user)
    return err
}

//获取用户列表
func List() ([]User, error) {
    var (
        users []User
        err   error
    )
    o := orm.NewOrm()
    //声明操作的表
    qs := o.QueryTable("user")
    //条件id大于10
    qs = qs.Filter("id__gt", 10)
    //返回几条数据
    qs = qs.Limit(2)
    //倒序是前面加上负号
    qs = qs.OrderBy("-id")
    //后面是设置返回的字段
    qs.All(&users, "Id", "Name")
    return users, err

}

//从这往下是通过原生sql操作数据库
//QueryRow 获取单条数据使用
//QueryRows 获取多条数据使用
//Exec  执行insert\update\delete语句
//通过sql获取用户信息
func SqlUserInfo(id int) (User, error) {
    var (
        user User
        err  error
    )
    o := orm.NewOrm()
    err = o.Raw("SELECT `name`,`mobile` FROM user Where id=? LIMIT 1", id).QueryRow(&user)
    return user, err
}

//通过sql保存用户
func SqlSave(name string, mobile string, avatar string) error {
    var (
        err error
    )
    o := orm.NewOrm()
    _, err = o.Raw("INSERT INTO user (`name`, `mobile`, `avatar`, `status`) VALUES (?, ?, ?, ?)", name, mobile, avatar, 0).Exec()
    return err
}

//原生sql修改用户名
func SqlUpdateUsername(id int, name string) error {
    var (
        err error
    )
    o := orm.NewOrm()
    _, err = o.Raw("UPDATE user SET name=? WHERE id=?", name, id).Exec()
    return err
}

//原生sql删除用户
func SqlDelete(id int) error {
    o := orm.NewOrm()
    _, err := o.Raw("DELETE FROM user WHERE id=?", id).Exec()
    return err
}

//原生sql实现获取用户列表
func SqlList() (int64, []User, error) {
    var (
        users []User
    )
    o := orm.NewOrm()
    num, err := o.Raw("SELECT * FROM user WHERE id>? ORDER BY id DESC LIMIT 2", 10).QueryRows(&users)
    return num, users, err
}