每学一门编程语言,都离不开学习它的语言特征:
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路由定义
有两种方式:
在router.php中配置
beego.Router("/hello", &controllers.MainController{}, "get:GetHello")
在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语法
- 统一使用 {{ 和 }} 作为左右标签
- 使用 . 来访问当前位置的上下文
- 使用 $ 来引用当前模板根级的上下文
- 使用 $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
}