一、前言
目前Go语言已经为大多数人所熟知,越来越多的开发人员选择使用Go语言来进行开发,但是如何使用
Go来进行web开发,在其他编程语言中都有对应的开发框架,当然在Go中也有,就是即将要介绍的——iris,它号称为速度最快的Go后端开发框架。在iris的网站文档上,列出该框架具备的一些特点和框架特性,列举如下:
1)聚焦高性能
2)健壮的静态路由支持和通配符子域名支持
3)视图系统支持超过5以上模板
4)支持定制事件的高可扩展性Websocket API
5)带有GC, 内存 & redis 提供支持的会话
6)方便的中间件和插件
7)完整 REST API
8)能定制 HTTP 错误
9)源码改变后自动加载
等等还有很多特性,大家可以参考Iris官方文档。
二、推荐网站
官网:iris-go.com/
框架源码地址:github.com/kataras/iri…
中文学习文档:learnku.com/docs/iris-g…
三、安装
go get -u github.com/kataras/iris
注意:iris要求你当前的go语言环境最低是1.8,但是官网推荐1.9以上
但是,由于GitHub上的资源,咱们在国内直接拉取会出现安装失败的问题,就例如:
# cd .; git clone https://github.com/kataras/iris D:\go_workspace\src\github.com\kataras\iris
Cloning into 'D:\go_workspace\src\github.com\kataras\iris'...
fatal: early EOF fatal: The remote end hung up unexpectedly
fatal: index-pack failed error: RPC
failed; curl 18 transfer closed with outstanding read data remaining package
github.com/kataras/iris: exit status 128
出现这种情况,不要慌,这是因为在国内访问GitHub会出问题,所以在我们安装Go语言中的一些包的安装就需要通过代理来实现
三(1)、 Go模块的全球代理
Linux\macOS
将以下指令添加到当前操作系统的环境变量当中.bashrc或者.bash_profile文件
# Enable the go modules feature
export GO111MODULE=on
# Set the GOPROXY environment variable
export GOPROXY=https://goproxy.io
windows
在windows中执行以下指令
# Enable the go modules feature
$env:GO111MODULE="on"
# Set the GOPROXY environment variable
$env:GOPROXY="https://goproxy.io"
现在,在构建和运行应用程序时,go将通过goproxy.io获取依赖项。在goproxy储存库中查看更多信息。
如果你的Go版本> = 1.13,则GOPRIVATE环境变量将控制go命令认为哪个模块是私有的(不可公开使用),因此不应使用代理或校验和数据库。例如:
go env -w GOPROXY=https://goproxy.io,direct
# Set environment variable allow bypassing the proxy for selected modules
go env -w GOPRIVATE=*.corp.example.com
将代理设置完之后,就可以来执行,官方指定的安装方式:
> go get -u github.com/kataras/iris
四、使用
ris 是一个低阶 Web 框架,它有一流的 MVC 支持,但它不限制你的文件夹结构,这是你的选择。
结构取决于你自己的需求。
如下图示例:
创建main.go
package main
import (
"github.com/Iris/web/controllers"
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/mvc"
)
func main() {
//iris实例
app := iris.New()
app.Logger().SetLevel("debug")
//注册iris模板
app.RegisterView(iris.HTML("./web/views", ".html"))
//注册控制器
mvc.New(app.Party("/hello")).Handle(new(controllers.MovieController))
//启动服务
err := app.Run(
iris.Addr("localhost:8080"),
)
if err != nil {
return
}
}
四 1、数据模型层(datamodels)
接下来开始写数据模型层 Movie
package datamodels
// Movie 是基本数据的的结构体.
// 它可以通过嵌入数据模型进行换行。
//电影或声明新的字段,但我们将使用此数据模型作为我们的应用程序中唯一的一个电影模型,为了简单起见。
type Movie struct {
ID int64 `json:"id"`
Name string `json:"name"`
Year int `json:"year"`
Genre string `json:"genre"`
Poster string `json:"poster"`
}
四 2、库/(储蓄库)(repositories)
可以直接访问 “数据源” 并可以直接操作数据的层。
这是可选的 (因为你也可以在 Service 内部使用),不过在展示这个例子的时候我们需要创建一个 Repository ,一个处理 “低级” 数据,可以直接访问 Movies 数据源的库。保留一个 Repository ,它是一个 interface (接口) 因为可能会不同,取决于您开发的应用程序的状态,也就是说在 production 开发状态下它会使用某些真正的 SQL 查询数据或者其他一些您用于查询的数据。
package repositories
import "github.com/Iris/datamodels"
// MovieRepository 要实现的接口
type MovieRepository interface {
GetMovieName() string
}
type MovieManager struct {
}
func NewMovieManager() MovieRepository {
return &MovieManager{}
}
func (m *MovieManager) GetMovieName() string {
//
movie := &datamodels.Movie{Name: "ninetyseven."}
return movie.Name
}
四 3、服务层(services)
可以访问 存储库 和 数据模型层 (如果是简单的应用,也可以访问 数据模型层)的函数的层。它应该包含大部分的逻辑。
我们需要一个服务与存储库在 high-level 和 存储 / 检索 Movies 中进行通信,这将在下面的 Web控制器上使用。
package services
import (
"github.com/Iris/repositories"
)
// `MovieService` 会处理一些 `movie` 数据模型层的 CRUID 操作
// 要实现的方法
type MovieService interface {
ShowMovieName() string
}
type MovieServiceManger struct {
repo repositories.MovieRepository
}
func NewMovieServiceManger(repo repositories.MovieRepository) MovieService {
return &MovieServiceManger{repo: repo}
}
func (m *MovieServiceManger) ShowMovieName() string {
return "我们获取的名称为:" + m.repo.GetMovieName()
}
四 4、控制器(controller)
处理 WEB 请求,是服务端和客户端之间的关联所在。
最重要的是 , Controller 是 Iris 框架的入口,它与 MovieService 之间进行通信。 我们通常将所有的与 HTTP 相关的内容存放在 web 名字的文件夹中,所以所有控制器都可以放在 web/controllers 目录下。当然也可以根据你个人的喜好 ,使用其他的设计模式。
package controllers
import (
"github.com/Iris/repositories"
"github.com/Iris/services"
"github.com/kataras/iris/v12/mvc"
)
type MovieController struct {
}
//定义方法
func (c *MovieController) Get() mvc.View {
//调用仓库
movieRepository := repositories.NewMovieManager()
//调用服务
movieService := services.NewMovieServiceManger(movieRepository)
//查询方法
MovieResult := movieService.ShowMovieName()
//返回视图
return mvc.View{
Name: "movie/index.html",
Data: MovieResult,
}
}
四 5、视图(view)
视图模型,用于在客户端展现的结构。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>{{.}}</h2>
</body>
</html>
五、执行
运行go run main.go
效果